804 Stimmen

Wie sende ich eine POST-Anfrage mit PHP?

Eigentlich möchte ich die Inhalte lesen, die nach der Suchanfrage kommen, wenn diese abgeschlossen ist. Das Problem ist, dass die URL nur POST Methoden, und es werden keine Maßnahmen mit GET Methode...

Ich muss alle Inhalte mit Hilfe von domdocument o file_get_contents() . Gibt es eine Methode, mit der ich Parameter mit POST Methode und lesen Sie dann den Inhalt über PHP ?

27voto

Wenn Sie zufällig Wordpress verwenden, um Ihre App zu entwickeln (es ist tatsächlich ein bequemer Weg, um Autorisierung, Info-Seiten usw. auch für sehr einfache Dinge zu bekommen), können Sie das folgende Snippet verwenden:

$response = wp_remote_post( $url, array('body' => $parameters));

if ( is_wp_error( $response ) ) {
    // $response->get_error_message()
} else {
    // $response['body']
}

Je nach den Möglichkeiten des Webservers wird die eigentliche HTTP-Anfrage auf unterschiedliche Weise gestellt. Weitere Einzelheiten finden Sie in der HTTP-API-Dokumentation .

Wenn Sie kein benutzerdefiniertes Theme oder Plugin entwickeln möchten, um die Wordpress-Engine zu starten, können Sie die folgenden Schritte einfach in einer isolierten PHP-Datei im Wordpress-Stammverzeichnis ausführen:

require_once( dirname(__FILE__) . '/wp-load.php' );

// ... your code

Es wird kein Theme angezeigt oder HTML ausgegeben, sondern nur die Wordpress-APIs verwendet!

26voto

Josip Ivic Punkte 3531

Es gibt noch eine andere CURL-Methode, wenn Sie diesen Weg gehen wollen.

Das ist ziemlich einfach, wenn man sich erst einmal mit der Funktionsweise der PHP-Curl-Erweiterung vertraut gemacht hat, die verschiedene Flags mit setopt()-Aufrufen kombiniert. In diesem Beispiel habe ich eine Variable $xml, die das XML enthält, das ich zum Senden vorbereitet habe - ich werde den Inhalt davon an die Testmethode von example senden.

$url = 'http://api.example.com/services/xmlrpc/';
$ch = curl_init($url);

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);
//process $response

Zuerst haben wir die Verbindung initialisiert, dann haben wir einige Optionen mit setopt() gesetzt. Diese teilen PHP mit, dass wir eine Post-Anfrage stellen und dass wir einige Daten mitschicken, indem wir die Daten liefern. Das Flag CURLOPT_RETURNTRANSFER weist curl an, die Ausgabe als Rückgabewert von curl_exec zu liefern, anstatt sie auszugeben. Dann führen wir den Aufruf durch und schließen die Verbindung - das Ergebnis steht in $response.

1 Stimmen

Im 3. curl_setopt()-Aufruf sollte das erste Argument sein $ch no $curl richtig?

0 Stimmen

Können Sie denselben Code für POST JSON-Daten verwenden? Ersetzen Sie aber $xml durch $json (wobei $json wahrscheinlich ein JSON-String ist).

25voto

CPHPython Punkte 9094

Eine weitere Alternative der kräuselfrei obige Methode ist die Verwendung des nativen Strom Funktionen:

  • stream_context_create() :

    Erstellt und gibt einen Stream-Kontext mit den in Optionen voreingestellt.

  • stream_get_contents() :

    Identisch mit file_get_contents() mit der Ausnahme, dass stream_get_contents() arbeitet mit einem bereits geöffneten Stream Ressource und gibt den restlichen Inhalt in einer Zeichenkette zurück, bis zu maxLänge Bytes und beginnend mit dem angegebenen Versatz .

Eine POST-Funktion mit diesen kann einfach wie folgt aussehen:

<?php

function post_request($url, array $params) {
  $query_content = http_build_query($params);
  $fp = fopen($url, 'r', FALSE, // do not use_include_path
    stream_context_create([
    'http' => [
      'header'  => [ // header array does not need '\r\n'
        'Content-type: application/x-www-form-urlencoded',
        'Content-Length: ' . strlen($query_content)
      ],
      'method'  => 'POST',
      'content' => $query_content
    ]
  ]));
  if ($fp === FALSE) {
    return json_encode(['error' => 'Failed to get contents...']);
  }
  $result = stream_get_contents($fp); // no maxlength/offset
  fclose($fp);
  return $result;
}

1 Stimmen

Diese CURL-less-Methode hat bei mir gut funktioniert, um reCAPTCHA von Google zu validieren. Diese Antwort konvergiert mit diesem Google-Code: github.com/google/recaptcha/blob/master/src/ReCaptcha/

1 Stimmen

Sie müssen nicht die fclose() wenn $fp es false . Denn fclose() erwartet eine Ressource als Parameter.

1 Stimmen

@Floris Hat es soeben bearbeitet und in der Tat ist die fclose docs heißt es: "Der Dateizeiger muss gültig sein". Danke, dass Sie das bemerkt haben!

23voto

Liga Punkte 2881

Hier wird nur ein Befehl ohne cURL verwendet. Super einfach.

echo file_get_contents('https://www.server.com', false, stream_context_create([
    'http' => [
        'method' => 'POST',
        'header'  => "Content-type: application/x-www-form-urlencoded",
        'content' => http_build_query([
            'key1' => 'Hello world!', 'key2' => 'second value'
        ])
    ]
]));

0 Stimmen

Wie wird der Key2 funktionieren? Was ist der Unterschied zwischen den beiden?

1 Stimmen

@Sayedidrees, um Schlüssel2 hinzuzufügen, können Sie ihn als zweites Array-Element eingeben. 'key1' => 'Hallo Welt!', 'key2' => 'zweiter Wert'

0 Stimmen

Hat wirklich gut funktioniert

10voto

Imran Zahoor Punkte 2155

Die bessere Art zu senden GET o POST Anfragen mit PHP ist wie folgt:

<?php
    $r = new HttpRequest('http://example.com/form.php', HttpRequest::METH_POST);
    $r->setOptions(array('cookies' => array('lang' => 'de')));
    $r->addPostFields(array('user' => 'mike', 'pass' => 's3c|r3t'));

    try {
        echo $r->send()->getBody();
    } catch (HttpException $ex) {
        echo $ex;
    }
?>

Der Code stammt aus der offiziellen Dokumentation hier http://docs.php.net/manual/da/httprequest.send.php

1 Stimmen

@akinuri danke für den Hinweis, ich werde die neue Version teilen.

0 Stimmen

Wie man es mit PHP 5x macht?

0 Stimmen

@YumYumYum Bitte lesen Sie die obige Antwort von dbau für 5x, die diese Technik verwendet php.net/handbuch/de/funktion.stream-kontext-erzeugen.php Sie können aber auch jederzeit auf die normale Lockenlösung zurückgreifen.

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