RAW POST mit cURL in PHP


126

Wie kann ich mit cURL einen RAW POST in PHP durchführen?

Roher Beitrag wie in ohne Kodierung, und meine Daten werden in einer Zeichenfolge gespeichert. Die Daten sollten wie folgt formatiert sein:

... usual HTTP header ...
Content-Length: 1039
Content-Type: text/plain

89c5fdataasdhf kajshfd akjshfksa hfdkjsa falkjshfsa
ajshd fkjsahfd lkjsahflksahfdlkashfhsadkjfsalhfd
ajshdfhsafiahfiuwhflsf this is just data from a string
more data kjahfdhsakjfhsalkjfdhalksfd

Eine Möglichkeit besteht darin, den gesamten gesendeten HTTP-Header manuell zu schreiben. Dies scheint jedoch weniger optimal zu sein.

Kann ich auf jeden Fall Optionen an curl_setopt () übergeben, die POST verwenden, Text / Plain verwenden und die Rohdaten von a senden $variable?

Antworten:


229

Ich habe gerade die Lösung gefunden und meine eigene Frage beantwortet, falls jemand anderes darauf stößt.

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,            "http://url/url/url" );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST,           1 );
curl_setopt($ch, CURLOPT_POSTFIELDS,     "body goes here" ); 
curl_setopt($ch, CURLOPT_HTTPHEADER,     array('Content-Type: text/plain')); 

$result=curl_exec ($ch);

4
Wird PHP den Content-Length-Header für Sie festlegen oder sollten Sie dies auch festlegen?
Eric Bloch

3
Ich kann das überhaupt nicht zum Laufen bringen. Ich habe eine Seite, auf der ich Rohdaten veröffentlichen möchte. Diese Seite zeichnet alle empfangenen Rohdaten in einer Datenbanktabelle auf. Es gibt überhaupt keine neuen Zeilen. Wissen Sie, ob sich hier seit '09 etwas geändert hat?
James

1
Dies funktioniert bei mir ohne Angabe eines HTTP-Headers.
Xryl669

12
Ich habe gerade festgestellt, dass der Körper hier jede gültige JSON-Zeichenfolge enthalten kann.
Shasi Kanth

1
Für diesen Rohbeitrag gibt es ein 2G-Limit. Wenn Sie versuchen, Dateien zu senden, die größer als 2G sind, werden diese auf 2G zurückgeschnitten. Dies ist eine Einschränkung des zu ladenden Zeichenfolgentyps.
Kaden Yealy

5

Implementierung mit Guzzle-Bibliothek:

use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;

$httpClient = new Client();

$response = $httpClient->post(
    'https://postman-echo.com/post',
    [
        RequestOptions::BODY => 'POST raw request content',
        RequestOptions::HEADERS => [
            'Content-Type' => 'application/x-www-form-urlencoded',
        ],
    ]
);

echo(
    $response->getBody()->getContents()
);

PHP CURL Erweiterung:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/post',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify POST method
     */
    CURLOPT_POST => true,

    /**
     * Specify request content
     */
    CURLOPT_POSTFIELDS => 'POST raw request content',
]);

$response = curl_exec($curlHandler);

curl_close($curlHandler);

echo($response);

Quellcode

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.