Wie sende ich eine POST-Anfrage mit PHP?

Lesezeit: 12 Minuten

Wie sende ich eine POST Anfrage mit PHP
Fred Tanrikut

Eigentlich möchte ich die Inhalte lesen, die nach der Suchanfrage kommen, wenn diese fertig ist. Das Problem ist, dass die URL nur akzeptiert POST Methoden, und es werden keine Aktionen ausgeführt GET Methode…

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

Wie sende ich eine POST Anfrage mit PHP
dbau

CURL-lose Methode mit PHP5:

$url="http://server.com/path";
$data = array('key1' => 'value1', 'key2' => 'value2');

// use key 'http' even if you send the request to https://...
$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => 'POST',
        'content' => http_build_query($data)
    )
);
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { /* Handle error */ }

var_dump($result);

Weitere Informationen zur Methode und zum Hinzufügen von Headern finden Sie im PHP-Handbuch, zum Beispiel:

  • Es ist erwähnenswert, dass, wenn Sie sich entscheiden, ein Array für die Header zu verwenden, die Schlüssel oder Werte NICHT mit ‘\r\n’ enden. stream_context_create() nimmt den Text nur bis zum ersten ‘\r\n’

    – Raubvogel

    23. Mai 2013 um 14:58 Uhr


  • Eine URL kann als Dateiname mit verwendet werden file_get_contents() nur wenn die fopen-Wrapper aktiviert wurden. Sehen php.net/manual/en/…

    – Pino

    27. November 2013 um 14:05 Uhr

  • Gibt es einen bestimmten Grund, CURL nicht zu verwenden?

    – JacobF

    31. August 2015 um 14:54 Uhr

  • @jvannistelrooy CURL für PHP ist eine Erweiterung, die möglicherweise nicht in allen Umgebungen vorhanden ist file_get_contents() ist Teil des Kerns von PHP. Außerdem kann die unnötige Verwendung einer Erweiterung die Angriffsfläche Ihrer App erweitern. ZB Google php curl cve

    – Taschensand

    12. Oktober 2016 um 7:54 Uhr

  • bool(false) verstehe ich??

    – Miomir Dancevic

    30. August 2017 um 7:50 Uhr

Wie sende ich eine POST Anfrage mit PHP
Fred Tanrikut

Du könntest benutzen cURL:

<?php
//The url you wish to send the POST request to
$url = $file_name;

//The data you want to send via POST
$fields = [
    '__VIEWSTATE '      => $state,
    '__EVENTVALIDATION' => $valid,
    'btnSubmit'         => 'Submit'
];

//url-ify the data for the POST
$fields_string = http_build_query($fields);

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//So that curl_exec returns the contents of the cURL; rather than echoing it
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 

//execute post
$result = curl_exec($ch);
echo $result;
?>

  • Dieser hat für mich funktioniert, weil die Seite, die ich an eine Seite sende, die keinen Inhalt hat, also die file_get_contents-Version nicht funktioniert hat.

    – KommentarLuv

    27. Oktober 2012 um 18:47 Uhr

  • Die file_get_contents-Lösung funktioniert nicht bei PHP-Konfigurationen mit allow_url_fopen Off (wie beim Shared Hosting). Diese Version verwendet die Curl-Bibliothek und ist meiner Meinung nach am “universellsten”, also gebe ich Ihnen meine Stimme

    – Dayron Gallardo

    26. August 2014 um 11:42 Uhr


  • Sie waren nicht auf der Website, von der Sie dieses Codebeispiel kopiert haben: davidwalsh.name/curl-post

    – befreit

    18. Mai 2015 um 18:06 Uhr

  • Obwohl es nicht sehr wichtig ist, müssen die CURLOPT_POSTFIELDS-Parameterdaten eigentlich nicht in eine Zeichenfolge (“urlified”) konvertiert werden. Zitat: “Dieser Parameter kann entweder als urlencodierter String wie ‘para1=val1&para2=val2&…’ oder als Array mit dem Feldnamen als Schlüssel und Felddaten als Wert übergeben werden. Wenn der Wert ein Array ist, der Content-Type Header wird auf multipart/form-data gesetzt.” Verknüpfung: php.net/manual/en/function.curl-setopt.php.

    – Eduard

    23. März 2016 um 16:00 Uhr


  • Auch nichts für ungut, es anders zu schreiben, aber ich weiß nicht, warum der Parameter CURLOPT_POST hier als Zahl angegeben ist, da es auf der Handbuchseite heißt, ihn auf einen booleschen Wert zu setzen. Zitat: “CURLOPT_POST: TRUE, um einen regulären HTTP-POST durchzuführen.” Verknüpfung: php.net/manual/en/function.curl-setopt.php.

    – Eduard

    23. März 2016 um 16:04 Uhr

1647065651 685 Wie sende ich eine POST Anfrage mit PHP
Dima L.

Ich verwende die folgende Funktion, um Daten mit curl zu posten. $data ist ein Array von zu postenden Feldern (wird mit http_build_query korrekt codiert). Die Daten werden mit application/x-www-form-urlencoded verschlüsselt.

function httpPost($url, $data)
{
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
}

@Edward erwähnt, dass http_build_query weggelassen werden kann, da curl das an den Parameter CURLOPT_POSTFIELDS übergebene Array korrekt codiert, aber beachten Sie, dass in diesem Fall die Daten mit multipart/form-data codiert werden.

Ich verwende diese Funktion mit APIs, die erwarten, dass Daten mit application/x-www-form-urlencoded codiert werden. Deshalb verwende ich http_build_query().

  • Das Übergeben von Array an CURLOPT_POSTFIELDS führt dazu, dass Daten mit multipart/form-data codiert werden, was möglicherweise nicht wünschenswert ist.

    – Dima L.

    25. März 2018 um 16:26 Uhr

  • Der Benutzer hat nach file_get_contents gefragt, also braucht er eine Lösung zum Ändern des default_stream_context

    – Radon8472

    1. August 2018 um 11:18 Uhr

  • Zur Verdeutlichung: Ich denke @DimaL. antwortet auf einen gelöschten Kommentar; http_build_query konvertiert $data Array in einen String umwandeln, wobei die Ausgabe als multipart/form-data vermieden wird.

    – WerkzeugmacherSteve

    24. April 2019 um 14:15 Uhr

  • @ Radon8472 – ... CURLOPT_RETURNTRANSFER, true ergibt sich $response den Inhalt enthält.

    – WerkzeugmacherSteve

    24. April 2019 um 14:33 Uhr


  • @ToolmakerSteve wie gesagt, die Frage war für file_get_contents und Ihre Lösung braucht CURL, was viele Leute nicht haben. Ihre Lösung funktioniert also möglicherweise, beantwortet jedoch nicht die Frage, wie dies mit den nativen integrierten Datei- / Stream-Funktionen zu tun ist.

    – Radon8472

    26. April 2019 um 8:30 Uhr

1647065651 338 Wie sende ich eine POST Anfrage mit PHP
Andreas

Ich empfehle Ihnen, das Open-Source-Paket zu verwenden fressen das vollständig einheitengetestet ist und die neuesten Codierungspraktiken verwendet.

Guzzle installieren

Gehen Sie zur Befehlszeile in Ihrem Projektordner und geben Sie den folgenden Befehl ein (vorausgesetzt, Sie haben bereits den Paketmanager Komponist Eingerichtet). Wenn Sie Hilfe bei der Installation von Composer benötigen, sollten Sie hier nachsehen.

php composer.phar require guzzlehttp/guzzle

Verwenden von Guzzle zum Senden einer POST-Anfrage

Die Verwendung von Guzzle ist sehr einfach, da es eine leichte objektorientierte API verwendet:

// Initialize Guzzle client
$client = new GuzzleHttp\Client();

// Create a POST request
$response = $client->request(
    'POST',
    'http://example.org/',
    [
        'form_params' => [
            'key1' => 'value1',
            'key2' => 'value2'
        ]
    ]
);

// Parse the response object, e.g. read the headers, body, etc.
$headers = $response->getHeaders();
$body = $response->getBody();

// Output headers and body for debugging purposes
var_dump($headers, $body);

1647065651 878 Wie sende ich eine POST Anfrage mit PHP
mwatter

Ich möchte einige Gedanken zur Locken-basierten Antwort von Fred Tanrikut hinzufügen. Ich weiß, dass die meisten von ihnen bereits in den Antworten oben geschrieben sind, aber ich denke, es ist eine gute Idee, eine Antwort zu zeigen, die alle zusammen enthält.

Hier ist die Klasse, die ich geschrieben habe, um HTTP-GET/POST/PUT/DELETE-Anforderungen basierend auf curl zu erstellen, die nur den Antworttext betrifft:

class HTTPRequester {
    /**
     * @description Make HTTP-GET call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPGet($url, array $params) {
        $query = http_build_query($params); 
        $ch    = curl_init($url.'?'.$query);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @description Make HTTP-POST call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPPost($url, array $params) {
        $query = http_build_query($params);
        $ch    = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @description Make HTTP-PUT call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPPut($url, array $params) {
        $query = \http_build_query($params);
        $ch    = \curl_init();
        \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
        \curl_setopt($ch, \CURLOPT_HEADER, false);
        \curl_setopt($ch, \CURLOPT_URL, $url);
        \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'PUT');
        \curl_setopt($ch, \CURLOPT_POSTFIELDS, $query);
        $response = \curl_exec($ch);
        \curl_close($ch);
        return $response;
    }
    /**
     * @category Make HTTP-DELETE call
     * @param    $url
     * @param    array $params
     * @return   HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPDelete($url, array $params) {
        $query = \http_build_query($params);
        $ch    = \curl_init();
        \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
        \curl_setopt($ch, \CURLOPT_HEADER, false);
        \curl_setopt($ch, \CURLOPT_URL, $url);
        \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'DELETE');
        \curl_setopt($ch, \CURLOPT_POSTFIELDS, $query);
        $response = \curl_exec($ch);
        \curl_close($ch);
        return $response;
    }
}

Verbesserungen

  • Verwenden von http_build_query, um den Abfragestring aus einem Anfrage-Array zu erhalten. (Sie könnten auch das Array selbst verwenden, siehe daher: http://php.net/manual/en/function.curl-setopt.php)
  • Die Antwort zurückgeben, anstatt sie zu wiederholen. Übrigens können Sie die Rückkehr vermeiden, indem Sie die Zeile entfernen curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);. Danach ist der Rückgabewert ein boolescher Wert (true = Anfrage war erfolgreich, sonst ist ein Fehler aufgetreten) und die Antwort wird zurückgemeldet. Sehen: http://php.net/en/manual/function.curl-exec.php
  • Sauberes Schließen der Sitzung und Löschen des Curl-Handlers durch using curl_close. Sehen: http://php.net/manual/en/function.curl-close.php
  • Verwenden von booleschen Werten für die curl_setopt Funktion, anstatt eine Zahl zu verwenden. (Ich weiß, dass jede Zahl ungleich Null auch als wahr angesehen wird, aber die Verwendung von wahr erzeugt einen besser lesbaren Code, aber das ist nur meine Meinung.)
  • Möglichkeit, HTTP-PUT/DELETE-Aufrufe durchzuführen (nützlich für RESTful-Service-Tests)

Anwendungsbeispiel

BEKOMMEN

$response = HTTPRequester::HTTPGet("http://localhost/service/foobar.php", array("getParam" => "foobar"));

POST

$response = HTTPRequester::HTTPPost("http://localhost/service/foobar.php", array("postParam" => "foobar"));

SETZEN

$response = HTTPRequester::HTTPPut("http://localhost/service/foobar.php", array("putParam" => "foobar"));

LÖSCHEN

$response = HTTPRequester::HTTPDelete("http://localhost/service/foobar.php", array("deleteParam" => "foobar"));

Testen

Mit dieser einfachen Klasse können Sie auch einige coole Servicetests durchführen.

class HTTPRequesterCase extends TestCase {
    /**
     * @description test static method HTTPGet
     */
    public function testHTTPGet() {
        $requestArr = array("getLicenses" => 1);
        $url        = "http://localhost/project/req/licenseService.php";
        $this->assertEquals(HTTPRequester::HTTPGet($url, $requestArr), '[{"error":false,"val":["NONE","AGPL","GPLv3"]}]');
    }
    /**
     * @description test static method HTTPPost
     */
    public function testHTTPPost() {
        $requestArr = array("addPerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPPost($url, $requestArr), '[{"error":false}]');
    }
    /**
     * @description test static method HTTPPut
     */
    public function testHTTPPut() {
        $requestArr = array("updatePerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPPut($url, $requestArr), '[{"error":false}]');
    }
    /**
     * @description test static method HTTPDelete
     */
    public function testHTTPDelete() {
        $requestArr = array("deletePerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPDelete($url, $requestArr), '[{"error":false}]');
    }
}

  • Für mich heißt es “Nicht erfasster Fehler: Aufruf der undefinierten Methode HTTPRequester::HTTPost()”. Ich habe Ihre Klasse einfach in meine .php-Datei eingefügt. Muss ich sonst noch etwas tun?

    – LinusGeffarth

    4. Februar 2018 um 18:54 Uhr

  • Kannst du bitte deinen Code posten? Es ist ziemlich schwer zu erraten, was ohne Code-Snippet falsch ist.

    – mwasser

    13. Februar 2018 um 23:52 Uhr

  • Wie gesagt, ich habe Ihre buchstäblich in meine einfache PHP-Datei kopiert und es hat mir diesen Fehler gegeben.

    – LinusGeffarth

    14. Februar 2018 um 1:27 Uhr

  • Ok, jetzt sehe ich das Problem, es war im Beispiel falsch! Sie müssen HTTPRequester::HTTPPost() anstelle von HTTPRequester::HTTPost() aufrufen

    – mwasser

    6. März 2018 um 8:59 Uhr

  • Ah. Das ist leicht zu übersehen. Ich musste Ihren Kommentar ungefähr 5x lesen, bevor ich das Extra entdeckte P. Danke!

    – LinusGeffarth

    6. März 2018 um 9:24 Uhr

1647065652 3 Wie sende ich eine POST Anfrage mit PHP
Gemeinschaft

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

Dies ist ziemlich einfach, sobald Sie sich mit der Funktionsweise der PHP-Curl-Erweiterung vertraut gemacht haben, indem Sie verschiedene Flags mit setopt() -Aufrufen kombinieren. 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 des Beispiels 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 damit senden und die Daten liefern. Das CURLOPT_RETURNTRANSFER-Flag weist curl an, uns die Ausgabe als Rückgabewert von curl_exec zu geben, anstatt sie auszugeben. Dann führen wir den Aufruf durch und schließen die Verbindung – das Ergebnis steht in $response.

  • Für mich heißt es “Nicht erfasster Fehler: Aufruf der undefinierten Methode HTTPRequester::HTTPost()”. Ich habe Ihre Klasse einfach in meine .php-Datei eingefügt. Muss ich sonst noch etwas tun?

    – LinusGeffarth

    4. Februar 2018 um 18:54 Uhr

  • Kannst du bitte deinen Code posten? Es ist ziemlich schwer zu erraten, was ohne Code-Snippet falsch ist.

    – mwasser

    13. Februar 2018 um 23:52 Uhr

  • Wie gesagt, ich habe Ihre buchstäblich in meine einfache PHP-Datei kopiert und es hat mir diesen Fehler gegeben.

    – LinusGeffarth

    14. Februar 2018 um 1:27 Uhr

  • Ok, jetzt sehe ich das Problem, es war im Beispiel falsch! Sie müssen HTTPRequester::HTTPPost() anstelle von HTTPRequester::HTTPost() aufrufen

    – mwasser

    6. März 2018 um 8:59 Uhr

  • Ah. Das ist leicht zu übersehen. Ich musste Ihren Kommentar ungefähr 5x lesen, bevor ich das Extra entdeckte P. Danke!

    – LinusGeffarth

    6. März 2018 um 9:24 Uhr

Wenn Sie zufällig WordPress verwenden, um Ihre App zu entwickeln (es ist eigentlich eine bequeme Möglichkeit, Autorisierungen, Infoseiten usw. selbst für sehr einfache Dinge zu erhalten), 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 nachdem, was auf dem Webserver verfügbar ist, verwendet es verschiedene Wege, um die eigentliche HTTP-Anfrage zu stellen. Weitere Einzelheiten finden Sie unter HTTP-API-Dokumentation.

Wenn Sie kein benutzerdefiniertes Design oder Plugin zum Starten der WordPress-Engine entwickeln möchten, können Sie einfach Folgendes in einer isolierten PHP-Datei im WordPress-Root tun:

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

// ... your code

Es wird kein Design anzeigen oder HTML ausgeben, hacken Sie einfach mit den WordPress-APIs los!

992880cookie-checkWie sende ich eine POST-Anfrage mit PHP?

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

Privacy policy