PHP-, cURL- und HTTP-POST-Beispiel?

Lesezeit: 10 Minuten

PHP cURL und HTTP POST Beispiel
mysqlearner

Kann mir jemand zeigen, wie man eine PHP-cURL mit einem HTTP-POST macht?

Ich möchte Daten wie folgt senden:

username=user1, password=passuser1, gender=1

Zu www.example.com

Ich erwarte, dass die cURL eine Antwort wie zurückgibt result=OK. Gibt es Beispiele?

1647068648 578 PHP cURL und HTTP POST Beispiel
miku

<?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 { ... }
?>

  • keine Notwendigkeit zu verwenden http_build_query() Parameter handhaben; Übergeben Sie einfach das Array an CURLOPT_POSTFIELDS reicht.

    – Raubvogel

    5. April 2016 um 3:13 Uhr

  • @Raptor, das ein Array direkt an CURLOPT_POSTFIELDS bereitstellt, macht tatsächlich eine etwas andere Art von POST. (Erwartet: 100-weiter)

    – Oleg Popov

    14. April 2016 um 4:49 Uhr

  • Auch wenn Wert von CURLOPT_POSTFIELDS ist ein Array, das Content-Type Header wird gesetzt multipart/form-data anstatt application/x-www-form-urlencoded. php.net/manual/en/function.curl-setopt.php

    – Chloe

    21. Juli 2016 um 2:34 Uhr


  • Die Verwendung von CURLOPT_RETURNTRANSFER bedeutet, dass curl_exec die Antwort als Zeichenfolge zurückgibt, anstatt sie auszugeben.

    – bnp887

    28. Dezember 2016 um 14:27 Uhr

  • Ich empfehle die Verwendung true anstatt 1 zum CURLOPT_POST.

    – FluoreszierendGrün5

    19. August 2017 um 8:53 Uhr

1647068649 494 PHP cURL und HTTP POST Beispiel
emixen

Verfahrenstechnisch

// 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);

Objektorientierte

<?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;
    }
}

Verwendungszweck

// 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()));
}

Nebenbemerkung hier: Es wäre am besten, eine Art Schnittstelle namens zu erstellen AdapterInterface zum Beispiel mit getResponse() -Methode und lassen Sie die obige Klasse sie implementieren. Dann können Sie diese Implementierung jederzeit durch einen anderen Adapter Ihrer Wahl ersetzen, ohne Nebenwirkungen für Ihre Anwendung.

Verwendung von HTTPS / Verschlüsselung des Datenverkehrs

Normalerweise gibt es ein Problem mit cURL in PHP unter dem Windows-Betriebssystem. Beim Versuch, eine Verbindung zu einem https-geschützten Endpunkt herzustellen, erhalten Sie eine Fehlermeldung, die Ihnen dies mitteilt certificate verify failed.

Die meisten Leute sagen hier der cURL-Bibliothek, dass sie Zertifikatsfehler einfach ignorieren und fortfahren soll (curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);). Da dies Ihren Code zum Laufen bringt, führen Sie eine riesige Sicherheitslücke ein und ermöglichen es böswilligen Benutzern, verschiedene Angriffe auf Ihre App durchzuführen, z Der Mann in der Mitte Angriff oder so.

Tu das niemals, niemals. Stattdessen müssen Sie einfach Ihre ändern php.ini und teilen Sie PHP mit, wo Ihre CA Certificate Datei ist es, Zertifikate korrekt überprüfen zu lassen:

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

Das Neueste cacert.pem kann aus dem Internet heruntergeladen werden bzw aus Ihrem bevorzugten Browser extrahiert. Beim Wechseln irgendwelche php.ini entsprechenden Einstellungen denken Sie daran, Ihren Webserver neu zu starten.

  • Dies sollte wirklich die akzeptierte Antwort sein, da es am besten wäre, die HTTP-Bibliothek die Codierung Ihrer Variablen handhaben zu lassen.

    – Eric Seestrand

    7. März 2016 um 14:57 Uhr


  • Dies ist nicht immer der Fall. Ich habe Webserver gesehen, die erwarten, dass POST-Variablen auf eine bestimmte Weise codiert werden, was dazu führt, dass sie andernfalls fehlschlagen. Es scheint mir, dass http_build_query() dafür tatsächlich zuverlässiger ist als cURL.

    – César

    14. März 2016 um 15:25 Uhr

  • Die HTTP-Spezifikation ist ziemlich einfach, wie die POST-Parameter aussehen sollten. Die Webserver-Software sollte sowieso Standards erfüllen.

    – emix

    15. März 2016 um 11:46 Uhr

  • Auf diese Weise zwingen Sie cURL dazu, einen etwas anderen POST-Typ zu verwenden. (Erwartet: 100-weiter). Überprüfen Sie diesen Artikel: support.urbanairship.com/entries/…

    – Oleg Popov

    14. April 2016 um 4:52 Uhr

  • Ausgehend von @ Césars Kommentar, dem PHP-Dokumentation weist ausdrücklich auf Folgendes hin: „Durch das Übergeben eines Arrays an CURLOPT_POSTFIELDS werden die Daten codiert als multipart/form-datawährend beim Übergeben einer URL-codierten Zeichenfolge die Daten als codiert werden application/x-www-form-urlencoded.”. Ich habe vor kurzem übermäßig viel Zeit damit verbracht, Fehler zu beheben, warum ein cURL-Aufruf auf einem Endpunkt eines Drittanbieters fehlschlägt, nur um schließlich festzustellen, dass sie keine Multipart/Form-Daten unterstützen.

    – Jake Z

    16. September 2016 um 19:31 Uhr


PHP cURL und HTTP POST Beispiel
Erich Leschinski

Ein Live-Beispiel für die Verwendung von php curl_exec für einen HTTP-Post:

Fügen Sie dies in eine Datei namens foobar.php ein:

<?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);
?>

Führen Sie es dann mit dem Befehl aus php foobar.phpgibt es diese Art von Ausgabe auf dem Bildschirm aus:

<!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>

Sie haben also einen PHP-POST an www.google.com gesendet und ihm einige Daten gesendet.

Wäre der Server so programmiert worden, dass er die Post-Variablen einliest, könnte er auf dieser Grundlage entscheiden, etwas anderes zu tun.

  • $postvars .= $key . $value; sollte $postvars .= $key . $value ."&"; oder nicht?

    – Manwal

    6. August 2014 um 7:41 Uhr

  • Wenn Sie sich diese Antwort noch einmal ansehen, können Sie auch Ihre benutzerdefinierte Implementierung des Query-String-Konverters durch ersetzen http_build_querygib ihm einfach die $fields array und es wird eine Abfragezeichenfolge ausgegeben.

    Benutzer2629998

    17. November 2014 um 11:54 Uhr

  • Beachten Sie, dass Sie Ihre Daten verschlüsseln sollten, damit sie sicher übermittelt werden können.

    – wtf8_decode

    16. Januar 2015 um 17:45 Uhr

  • Oh nein, versuchen Sie nicht, die Postschnur selbst zu bauen! benutze das: curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));

    – Oriadam

    29. September 2015 um 0:21 Uhr

  • -1, weil Sie Ihre Post-Variablen nicht maskieren. Das Beispiel des OP sendet vom Benutzer übermittelte Benutzernamen und Kennwörter zur Authentifizierung. Mit Ihrer Lösung kann sich ein Benutzer mit einem & in seinem Passwort niemals anmelden. oriadams Kommentar ist richtig, aber Sie können ihn weglassen http_build_query wie: curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);

    – Eric Seestrand

    7. März 2016 um 14:56 Uhr

Es ist leicht zu erreichen mit:

<?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);

Curl Post + Fehlerbehandlung + Header setzen [thanks to @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',
]);

  • Ihr Code schließt das Handle nicht und gibt keine Ressourcen frei, weil Sie curl_close nach dem Auslösen einer Ausnahme verwenden. Sie sollten curl_close innerhalb eines finally-Blocks verwenden.

    – emix

    25. Januar 2019 um 10:04 Uhr

1.Schritt für Schritt

  • Initialisieren Sie die cURL-Sitzung:
$url = "www.domain.com";
$ch = curl_init($url);
  • Wenn Ihre Anfrage Header wie Bearer-Token oder definierende JSON-Inhalte enthält, müssen Sie diese festlegen HTTPHEADER Optionen für cURL:
$token = "generated token code";
curl_setopt(
    $ch, 
    CURLOPT_HTTPHEADER, 
    array(
        'Content-Type: application/json', // for define content type that is json
        'bearer: '.$token, // send token in header request
        'Content-length: 100' // content length for example 100 characters (can add by strlen($fields))
    )
);
  • Wenn Sie den Header in den Ausgabesatz aufnehmen möchten CURLOPT_HEADER zu true:
curl_setopt($ch, CURLOPT_HEADER, false);
  • Satz RETURNTRANSFER Option zu true um die Übertragung als String zurückzugeben, anstatt sie direkt auszugeben:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  • Zur Überprüfung kann das Vorhandensein eines Common Name im SSL-Peer-Zertifikat eingestellt werden 0(to not check the names), 1(not supported in cURL 7.28.1), 2(default value and for production mode):
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
  • Zum Posten von Feldern als Array von cURL:
$fields = array(
    "username" => "user1",
    "password" => "passuser1",
    "gender" => 1
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
  • Führen Sie cURL aus und geben Sie die Zeichenfolge zurück. Abhängig von Ihrer Ressource gibt dies eine Ausgabe wie zurück result=OK:
$result = curl_exec($ch);
  • cURL-Ressource schließen und Systemressourcen freigeben:
curl_close($ch);

2. Als Klasse verwenden

  • Das Ganze call_cURL Klasse erweiterbar:
class class_name_for_call_cURL {
    protected function getUrl() {
        return "www.domain.com";
    }

    public function call_cURL() {
        $token = "generated token code";

        $fields = array(
            "username" => "user1",
            "password" => "passuser1",
            "gender" => 1
        );

        $url = $this->getUrl();
        $output = $this->_execute($fields, $url, $token);
        
        // if you want to get json data
        // $output = json_decode($output);
            
        if ($output == "OK") {
            return true;
        } else {
             return false;
        }
    }

    private function _execute($postData, $url, $token) {
        // for sending data as json type
        $fields = json_encode($postData);

        $ch = curl_init($url);
        curl_setopt(
            $ch, 
            CURLOPT_HTTPHEADER, 
            array(
                'Content-Type: application/json', // if the content type is json
                'bearer: '.$token // if you need token in header
            )
        );
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);

        $result = curl_exec($ch);
        curl_close($ch);

        return $result;
    }
}
  • Verwendung der Klasse und Aufruf von cURL:
$class = new class_name_for_call_cURL();
var_dump($class->call_cURL()); // output is true/false

3.Eine Funktion

  • Eine Funktion für die Verwendung überall dort, wo sie benötigt wird:
function get_cURL() {

        $url = "www.domain.com";
        $token = "generated token code";

        $postData = array(
            "username" => "user1",
            "password" => "passuser1",
            "gender" => 1
        );

        // for sending data as json type
        $fields = json_encode($postData);

        $ch = curl_init($url);
        curl_setopt(
            $ch, 
            CURLOPT_HTTPHEADER, 
            array(
                'Content-Type: application/json', // if the content type is json
                'bearer: '.$token // if you need token in header
            )
        );
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);

        $result = curl_exec($ch);
        curl_close($ch);

        return $result;
}
  • Diese Funktion ist nur nutzbar durch:
var_dump(get_cURL());

  • Ihr Code schließt das Handle nicht und gibt keine Ressourcen frei, weil Sie curl_close nach dem Auslösen einer Ausnahme verwenden. Sie sollten curl_close innerhalb eines finally-Blocks verwenden.

    – emix

    25. Januar 2019 um 10:04 Uhr

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;
}

  • Ihr Code schließt das Handle nicht und gibt keine Ressourcen frei, weil Sie curl_close nach dem Auslösen einer Ausnahme verwenden. Du solltest curl_close in einem finally Block.

    – emix

    25. Januar 2019 um 10:03 Uhr


992980cookie-checkPHP-, cURL- und HTTP-POST-Beispiel?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy