RAW POST przy użyciu cURL w PHP

126

Jak mogę wykonać RAW POST w PHP przy użyciu cURL?

Surowy post jak w bez kodowania, a moje dane są przechowywane w ciągu. Dane powinny być sformatowane w następujący sposób:

... 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

Jedną z opcji jest ręczne zapisanie całego wysyłanego nagłówka HTTP, ale wydaje się to mniej optymalne.

W każdym razie, czy mogę po prostu przekazać opcje do curl_setopt (), które mówią, że użyj POST, użyj text / plain i wyślij surowe dane z $variable?

Nieznane
źródło

Odpowiedzi:

229

Właśnie znalazłem rozwiązanie, odpowiadając na moje własne pytanie na wypadek, gdyby ktoś się na nie natknął.

$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);
Nieznane
źródło
4
czy php ustawi dla ciebie nagłówek content-length, czy też powinieneś to ustawić?
Eric Bloch
3
W ogóle nie mogę sprawić, żeby to zadziałało. Mam stronę, na której próbuję przesłać surowe dane. Ta strona rejestruje wszystkie surowe dane, które otrzymuje, do tabeli bazy danych. W ogóle nie ma nowych wierszy. Czy wiesz, czy coś się tutaj zmieniło od '09?
James
1
U mnie działa to bez określania nagłówka HTTP.
xryl669
12
Właśnie zdałem sobie sprawę, że body go tutaj może zawierać dowolny prawidłowy ciąg json.
shasi kanth
1
Ten nieprzetworzony post ma limit 2G. Jeśli spróbujesz wysłać plik większy niż 2 GB, zostaną one skrócone z powrotem do 2 GB. Jest to ograniczenie typu ładowanego łańcucha.
Kaden Yealy
5

Wdrożenie z biblioteką Guzzle:

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

Rozszerzenie PHP CURL:

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

Kod źródłowy

Serhii Andriichuk
źródło