639 Stimmen

PHP, cURL, und HTTP POST Beispiel?

Kann mir jemand zeigen, wie man ein PHP cURL mit einem HTTP POST zu tun?

Ich möchte Daten wie diese senden:

username=user1, password=passuser1, gender=1

An www.example.com

Ich erwarte von cURL eine Antwort wie result=OK . Gibt es irgendwelche Beispiele?

1082voto

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

70 Stimmen

Keine Notwendigkeit der Verwendung http_build_query() um Parameter zu behandeln; übergeben Sie einfach das Array an CURLOPT_POSTFIELDS ist ausreichend.

13 Stimmen

@Raptor Bereitstellung von Array direkt an CURLOPT_POSTFIELDS tatsächlich curl macht etwas andere Art von POST. (Erwartet: 100-Fortsetzung)

37 Stimmen

Auch wenn der Wert von CURLOPT_POSTFIELDS ein Array ist, wird die Content-Type Kopfzeile wird gesetzt auf multipart/form-data 代わりに application/x-www-form-urlencoded . php.net/manual/de/function.curl-setopt.php

358voto

emix Punkte 14254

Verfahren

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

Objektorientiert

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

Verwendung

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

Anmerkung am Rande: Es wäre am besten, eine Art Schnittstelle namens AdapterInterface zum Beispiel mit getResponse() Methode und lassen Sie sie von der oben genannten Klasse implementieren. Dann können Sie diese Implementierung jederzeit mit einem anderen Adapter Ihrer Wahl austauschen, ohne dass Ihre Anwendung beeinträchtigt wird.

Verwendung von HTTPS / Verschlüsselung des Datenverkehrs

Normalerweise gibt es ein Problem mit cURL in PHP unter dem Windows-Betriebssystem. Wenn Sie versuchen, eine Verbindung zu einem https-geschützten Endpunkt herzustellen, erhalten Sie eine Fehlermeldung, die besagt, dass certificate verify failed .

Die meisten Benutzer weisen die cURL-Bibliothek an, Zertifikatsfehler einfach zu ignorieren und fortzufahren ( curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); ). Da dadurch Ihr Code funktioniert, führen Sie eine große Sicherheitslücke ein und ermöglichen es böswilligen Benutzern, verschiedene Angriffe auf Ihre Anwendung auszuführen, wie Der Mann in der Mitte Angriff oder ähnliches.

Tun Sie das nie und nimmer. Stattdessen müssen Sie einfach Ihre php.ini und sagen Sie PHP, wo Ihr CA Certificate Datei ist, damit sie Zertifikate korrekt verifizieren kann:

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

Das Neueste cacert.pem können aus dem Internet heruntergeladen werden oder extrahiert von Ihrem Lieblingsbrowser . Bei der Änderung einer php.ini Einstellungen zu ändern, müssen Sie Ihren Webserver neu starten.

8 Stimmen

Dies sollte eigentlich die akzeptierte Antwort sein, denn die beste Vorgehensweise wäre es, die HTTP-Bibliothek die Kodierung Ihrer Variablen übernehmen zu lassen.

5 Stimmen

Dies ist nicht immer der Fall. Ich habe Webserver gesehen, die erwarten, dass POST-Variablen auf eine bestimmte Art und Weise kodiert sind, und die andernfalls fehlschlagen. Es scheint mir, dass http_build_query() in diesem Fall zuverlässiger ist als cURL.

5 Stimmen

Die HTTP-Spezifikation ist ziemlich eindeutig, wie die POST-Parameter aussehen sollten. Die Webserver-Software sollte sich ohnehin an die Standards halten.

44voto

Eric Leschinski Punkte 134271

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

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 php foobar.php wird diese Art von Ausgabe auf dem Bildschirm ausgegeben:

<!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 durchgeführt und ihm einige Daten geschickt.

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

0 Stimmen

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

0 Stimmen

Wenn Sie sich diese Antwort noch einmal ansehen, können Sie auch Ihre benutzerdefinierte Abfrage-String-Konverter-Implementierung ersetzen durch http_build_query geben Sie ihm einfach die $fields Array und gibt eine Abfragezeichenfolge aus.

0 Stimmen

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

39voto

cn007b Punkte 15768

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

1 Stimmen

Es ist eine gute Praxis, die Locken mit curl_close($ch);

22voto

Pejman Kheyri Punkte 2492

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 definierte JSON-Inhalte enthält, müssen Sie die HTTPHEADER Optionen zu 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 die Kopfzeile in den Ausgabesatz aufnehmen wollen CURLOPT_HEADER a true :

    curl_setopt($ch, CURLOPT_HEADER, false);

  • Satz RETURNTRANSFER Option zu true um die Übertragung als Zeichenkette zurückzugeben, anstatt sie direkt auszugeben:

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  • Um das Vorhandensein eines gemeinsamen Namens im SSL-Peer-Zertifikat zu überprüfen, kann auf 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);

  • Für die Buchung von Feldern als Array durch cURL:

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

  • Führt cURL aus und gibt die Zeichenkette zurück. Je nach Ressource gibt dies eine Ausgabe wie result=OK :

    $result = curl_exec($ch);

  • Schließen Sie die cURL-Ressource, und geben Sie Systemressourcen frei:

    curl_close($ch);

2. als Klasse verwenden

  • Die gesamte call_cURL Klasse, die erweitert werden kann:

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

    }

  • Verwenden Sie die Klasse und rufen Sie cURL:

    $class = new class_name_for_call_cURL(); var_dump($class->call_cURL()); // output is true/false

3. eine Funktion

  • Eine Funktion, die überall dort eingesetzt werden kann, 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 von verwendbar:

    var_dump(get_cURL());

0 Stimmen

Hallo @Pejman, wie geht es dir? Ich habe gesehen, dass du dich gut damit auskennst. Könntest du also einen Blick auf meine ähnliche Frage werfen? stackoverflow.com/questions/72122223/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X