POST CRU usando cURL em PHP

126

Como posso fazer um POST RAW no PHP usando cURL?

Postagem não processada, sem codificação, e meus dados são armazenados em uma string. Os dados devem ser formatados assim:

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

Uma opção é escrever manualmente todo o cabeçalho HTTP que está sendo enviado, mas isso parece menos otimizado.

De qualquer forma, posso apenas passar opções para curl_setopt () que dizem usar POST, usar texto / sem formatação e enviar os dados brutos de a $variable?

O desconhecido
fonte

Respostas:

229

Acabei de encontrar a solução, meio que respondendo à minha própria pergunta, caso alguém tropeçar nela.

$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);
O desconhecido
fonte
4
O php definirá o cabeçalho de tamanho do conteúdo para você ou você também deve defini-lo?
22813 Eric Bloch
3
Não consigo fazer isso funcionar. Eu tenho uma página na qual estou tentando postar dados brutos. Essa página registra todos os dados brutos que recebe em uma tabela de banco de dados. Não há novas linhas. Você sabe se alguma coisa mudou aqui desde 09?
James
1
Isso funciona para mim, sem especificar nenhum cabeçalho HTTP.
precisa saber é o seguinte
12
Acabei de perceber que body aqui pode incluir qualquer string json válida.
Shasi kanth
1
Há um limite de 2G para este post bruto. Se você tentar enviar arquivos maiores que 2G, eles serão truncados de volta para 2G. É uma limitação do tipo de string que está sendo carregado.
Kaden Yealy
5

Implementação com a biblioteca 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()
);

Extensão 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);

Código fonte

Serhii Andriichuk
fonte