POST RAW usando cURL in PHP


126

Come posso fare un POST RAW in PHP usando cURL?

Posta grezza come in senza alcuna codifica e i miei dati sono archiviati in una stringa. I dati devono essere formattati in questo modo:

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

Un'opzione è scrivere manualmente l'intera intestazione HTTP inviata, ma sembra meno ottimale.

Ad ogni modo, posso semplicemente passare le opzioni a curl_setopt () che dicono usare POST, usare text / plain e inviare i dati grezzi da un $variable?

Risposte:


229

Ho appena trovato la soluzione, in qualche modo rispondendo alla mia domanda nel caso in cui qualcun altro si imbattesse in essa.

$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
php imposterà l'intestazione della lunghezza del contenuto per te o dovresti impostare anche quello?
Eric Bloch,

3
Non riesco a farlo funzionare affatto. Ho una pagina in cui sto cercando di pubblicare dati non elaborati. Quella pagina registra tutti i dati grezzi che riceve in una tabella del database. Non ci sono nuove righe. Sai se qualcosa è cambiato qui dal '09?
James,

1
Questo funziona per me, senza specificare alcuna intestazione HTTP.
Xryl669,

12
Ho appena capito che il corpo che va qui può includere qualsiasi stringa json valida.
Shasi Kanth,

1
C'è un limite di 2G per questo post non elaborato. Se si tenta di inviare file di dimensioni superiori a 2G, verranno troncati di nuovo a 2G. È una limitazione del tipo di stringa che viene caricato.
Kaden Yealy,

5

Implementazione con libreria 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()
);

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

Codice sorgente

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.