IT-Swarm.Net

PHP + curl, HTTP POST kod uzorka?

Može li mi netko pokazati kako napraviti php curl s HTTP POST-om?

Želim poslati ove podatke:

username=user1, password=passuser1, gender=1

Za www.domain.com

Očekujem da će curl vratiti odgovor poput result=OK. Ima li primjera?

423
mysqllearner
<?php
//
// A very simple PHP example that sends a HTTP POST to a remote site
//

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"http://www.example.com/tester.phtml");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
            "postvar1=value1&postvar2=value2&postvar3=value3");

// In real life you should use something like:
// curl_setopt($ch, CURLOPT_POSTFIELDS, 
//          http_build_query(array('postvar1' => 'value1')));

// Receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($ch);

curl_close ($ch);

// Further processing ...
if ($server_output == "OK") { ... } else { ... }
?>
725
miku

Proceduralno

// set post fields
$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];

$ch = curl_init('http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

// execute!
$response = curl_exec($ch);

// close the connection, release resources used
curl_close($ch);

// do anything you want with your response
var_dump($response);

Objektno orijentirano

<?php

// mutatis mutandis
namespace MyApp\Http;

class CurlPost
{
    private $url;
    private $options;

    /**
     * @param string $url     Request URL
     * @param array  $options cURL options
     */
    public function __construct($url, array $options = [])
    {
        $this->url = $url;
        $this->options = $options;
    }

    /**
     * Get the response
     * @return string
     * @throws \RuntimeException On cURL error
     */
    public function __invoke(array $post)
    {
        $ch = curl_init($this->url);

        foreach ($this->options as $key => $val) {
            curl_setopt($ch, $key, $val);
        }

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

        $response = curl_exec($ch);
        $error    = curl_error($ch);
        $errno    = curl_errno($ch);

        if (is_resource($ch)) {
            curl_close($ch);
        }

        if (0 !== $errno) {
            throw new \RuntimeException($error, $errno);
        }

        return $response;
    }
}

Upotreba

// create curl object
$curl = new \MyApp\Http\CurlPost('http://www.example.com');

try {
    // execute the request
    echo $curl([
        'username' => 'user1',
        'password' => 'passuser1',
        'gender'   => 1,
    ]);
} catch (\RuntimeException $ex) {
    // catch errors
    die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode()));
}

Side napomena ovdje: bilo bi najbolje stvoriti neku vrstu sučelja zvanog AdapterInterface, na primjer, metodom getResponse() i pustiti klasu iznad da je implementira. Tada možete uvijek zamijeniti ovu implementaciju s nekim drugim prilagođenim adapterom, bez ikakvih nuspojava na vašoj aplikaciji.

Korištenje HTTPS/šifriranja prometa

Obično je problem sa cURL-om u PHP pod Windows operativnim sustavom. Dok se pokušavate povezati s https zaštićenom krajnjom točkom, dobit ćete pogrešku koja vam govori da je certificate verify failed.

Ono što većina ljudi ovdje radi je reći knjižnici CURL da jednostavno ignorira pogreške u certifikatima i nastavi (curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);). Kako će ovo učiniti da vaš kod radi, uvećete veliku sigurnosnu rupu i omogućite zlonamernim korisnicima da izvode razne napade na vašu aplikaciju poput Man In The Middle napad ili slično.

Nikad, nikad to ne učinite. Umjesto toga, jednostavno trebate izmijeniti svoj php.ini i reći PHP gdje je vaša datoteka CA Certificate kako bi omogućila ispravnu provjeru certifikata:

; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem

Najnoviji cacert.pem možete preuzeti s interneta ili izvađen iz vašeg omiljenog preglednika . Kada mijenjate bilo koje postavke povezane s php.ini, ne zaboravite ponovno pokrenuti web poslužitelj.

217
emix

Primjer uživo korištenja php curl_exec za HTTP post:

Stavite ovo u datoteku koja se zove foobar.php:

<?php
  $ch = curl_init();
  $skipper = "luxury assault recreational vehicle";
  $fields = array( 'penguins'=>$skipper, 'bestpony'=>'rainbowdash');
  $postvars = '';
  foreach($fields as $key=>$value) {
    $postvars .= $key . "=" . $value . "&";
  }
  $url = "http://www.google.com";
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_POST, 1);                //0 for a get request
  curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
  curl_setopt($ch,CURLOPT_TIMEOUT, 20);
  $response = curl_exec($ch);
  print "curl response is:" . $response;
  curl_close ($ch);
?>

Zatim ga pokrenite pomoću naredbe php foobar.php, ona baca takav izlaz na zaslon:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Title</title>

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<body>
  A mountain of content...
</body>
</html>

Dakle, napravili ste PHP POST na www.google.com i poslali ste joj neke podatke.

Da je poslužitelj bio programiran za čitanje u post varijablama, na temelju toga mogao bi odlučiti učiniti nešto drugačije.

27
Eric Leschinski

Do njega se lako može doći:

<?php

$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.domain.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$response = curl_exec($ch);
var_export($response);
20
Vladimir Kovpak

Curl Post + rukovanje pogreškama + postavljanje zaglavlja [hvala @ mantas-d]:

function curlPost($url, $data=NULL, $headers = NULL) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if(!empty($data)){
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }

    $response = curl_exec($ch);

    if (curl_error($ch)) {
        trigger_error('Curl Error:' . curl_error($ch));
    }

    curl_close($ch);
    return $response;
}


curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);
8
MSS
curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);


function curlPost($url, $data) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $response = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);
    if ($error !== '') {
        throw new \Exception($error);
    }

    return $response;
}
6
Mantas D

Ako obrazac koristi preusmjeravanja, provjeru autentičnosti, kolačiće, SSL (https) ili bilo što drugo osim potpuno otvorene skripte koja očekuje POST varijable, počet ćete škropiti zube vrlo brzo. Pogledajte Snoopy , koji radi točno ono što imate na umu dok uklanja potrebu da se postavi mnogo troškova.

6
Anthony

Evo nekoliko koda na ploči za PHP + curl http://www.webbotsspidersscreenscrapers.com/DSP_download.php

uključiti u ovu knjižnicu pojednostavit će razvoj

<?php
# Initialization
include("LIB_http.php");
include("LIB_parse.php");
$product_array=array();
$product_count=0;

# Download the target (store) web page
$target = "http://www.tellmewhenitchanges.com/buyair";
$web_page = http_get($target, "");
    ...
?>
4
AzizSM

Jednostavniji odgovor AKO vi prosljeđujete informacije na svoju web stranicu je korištenje varijable SESSION. Započnite php stranicu sa:

session_start();

Ako u nekom trenutku postoje informacije koje želite generirati u PHP i prelazite na sljedeću stranicu u sesiji, umjesto da koristite POST varijablu, dodijelite je varijabli SESSION. Primjer:

$_SESSION['message']='www.'.$_GET['school'].'.edu was not found.  Please try again.'

Zatim na sljedećoj stranici jednostavno navodite ovu varijablu SESSION. NAPOMENA: nakon što ga upotrijebite, pazite da ga uništite kako više ne bi postojao nakon što ga upotrijebite:

if (isset($_SESSION['message'])) {echo $_SESSION['message']; unset($_SESSION['message']);}
3
user2532795

Ako se pokušate prijaviti na web mjestu s kolačićima.

Ovaj kod:

if ($server_output == "OK") { ... } else { ... }

Ako se pokušate prijaviti, neće raditi jer mnoge web-lokacije vraćaju status 200, ali post nije uspješan.

Jednostavan način provjere je li prijava uspješna je provjera ako ponovno postavlja kolačiće. Ako u izlazu imaju niz Set-Cookies, to znači da postovi nisu uspješni i započinje novu sesiju.

Također post može biti uspješan, ali umjesto toga status može biti preusmjeravanje na 200.

Da biste bili sigurni da je post uspješan, pokušajte ovo:

Slijedite lokaciju nakon posta, tako da će se otvoriti stranica na kojoj se post preusmjerava:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

I nego provjerite postoje li novi zahtjevi u zahtjevu:

if (!preg_match('/^Set-Cookie:\s*([^;]*)/mi', $server_output)) 

{echo 'post successful'; }

else { echo 'not successful'; }
2
Atanas Atanasov

Primjeri slanja obrazac i sirov podataka:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/post',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify POST method
     */
    CURLOPT_POST => true,

    /**
     * Specify array of form fields
     */
    CURLOPT_POSTFIELDS => [
        'foo' => 'bar',
        'baz' => 'biz',
    ],
]);

$response = curl_exec($curlHandler);

curl_close($curlHandler);

echo($response);
0
Serge Andriichuk