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?

20voto

MSS Punkte 3168

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

1 Stimmen

Ihr Code wird das Handle nicht schließen und die Ressourcen freigeben, weil Sie curl_close nach dem Auslösen einer Exception schließen. Sie sollten curl_close innerhalb eines finally-Blocks ausführen.

11voto

cloudxix Punkte 313

Ich bin überrascht, dass niemand file_get_contents vorgeschlagen hat:

$url = "http://www.example.com";
$parameters = array('username' => 'user1', 'password' => 'passuser1', 'gender' => '1');
$options = array('http' => array(
    'header'  => 'Content-Type: application/x-www-form-urlencoded\r\n',
    'method'  => 'POST',
    'content' => http_build_query($parameters)
));

$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);

Es ist einfach, es funktioniert; ich verwende es in einer Umgebung, in der ich den Code an beiden Enden kontrolliere.

noch besser, verwenden Sie json_decode (und richten Sie Ihren Code so ein, dass er JSON zurückgibt)

$result = json_decode(file_get_contents($url, false, $context), TRUE);

Dieser Ansatz ruft Curl hinter den Kulissen auf, aber Sie müssen nicht so viele Hürden überwinden.

Die Antwort wurde von dieser ursprünglichen Antwort an anderer Stelle auf Stack Overflow verfeinert: PHP sendet Variablen an file_get_contents()

1 Stimmen

Das ist eine wirklich gute Antwort. Allerdings funktioniert es bei mir nur, wenn ich den Content-Type-Header-Teil entferne.

1 Stimmen

@lukas, der Content-Type-Header wurde von einem SO-Editor hinzugefügt, nicht von mir...

1 Stimmen

Hallo @cloudxix, wie geht es dir? Ich sah Sie gut mit diesem.. so könnten Sie einen Blick in meine ähnliche Frage nehmen? stackoverflow.com/questions/72122223/

8voto

Mantas D Punkte 3643
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;
}

1 Stimmen

Ihr Code wird das Handle nicht schließen und Ressourcen freigeben, da Sie curl_close nach dem Auslösen einer Exception schließen. Sie sollten curl_close innerhalb einer finally Block.

6voto

Anthony Punkte 35161

Wenn das Formular Weiterleitungen, Authentifizierung, Cookies, SSL (https) oder irgendetwas anderes als ein völlig offenes Skript verwendet, das POST-Variablen erwartet, werden Sie sehr schnell mit den Zähnen knirschen. Werfen Sie einen Blick auf Snoopy die genau das tut, was Sie vorhaben, ohne dass Sie einen großen Teil des Overheads einrichten müssen.

0 Stimmen

Wenn Sie bei der Bestandslib bleiben wollen, fügen Sie einfach curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

0 Stimmen

Der einzige Nachteil ist, dass man sich immer noch mit dem Setzen eines Cookie-Gefäßes und anderen potenziellen Problemen auseinandersetzen muss (z. B. ob man Weiterleitungen folgen soll, wie man mit nicht HTTP-basierter Authentifizierung umgehen soll usw.). 6 Jahre später würde ich das allgemeinere Konzept eines "headless-browser" anstelle dieser spezifischen Bibliothek empfehlen (oder irgendetwas auf sourceforge, wie veraltet, nicht wahr?) Und obwohl ich mich im Allgemeinen nur direkt mit curl-Optionen befasse, würde ich immer noch empfehlen, eine headless-browser-Bibliothek zu suchen, die PSR-7 kompatibel (Guzzle ist die einzige, die ich auswendig kenne), um Kopfschmerzen zu vermeiden.

4voto

user2532795 Punkte 49

Eine einfachere Lösung, WENN Sie Informationen an Ihre eigene Website weitergeben, ist die Verwendung einer SESSION-Variable. Beginnen Sie die php-Seite mit:

session_start();

Wenn Sie zu einem bestimmten Zeitpunkt Informationen in PHP generieren und an die nächste Seite in der Sitzung weitergeben möchten, verwenden Sie keine POST-Variable, sondern weisen Sie sie einer SESSION-Variable zu. Beispiel:

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

Auf der nächsten Seite verweisen Sie dann einfach auf diese SESSION-Variable. HINWEIS: Achten Sie darauf, dass Sie die Variable nach ihrer Verwendung löschen, damit sie nicht bestehen bleibt:

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

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