RAW POST с использованием cURL в PHP

126

Как я могу сделать RAW POST в PHP с помощью cURL?

Необработанный пост без какой-либо кодировки, и мои данные хранятся в строке. Данные должны быть отформатированы следующим образом:

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

Один из вариантов - вручную записать весь отправляемый HTTP-заголовок, но это кажется менее оптимальным.

В любом случае, могу ли я просто передать параметры curl_setopt (), которые говорят, что использовать POST, использовать text / plain и отправлять необработанные данные из a $variable?

Неизвестный
источник

Ответы:

229

Я только что нашел решение, как бы отвечая на свой вопрос, на случай, если кто-то еще наткнется на него.

$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 заголовок длины содержимого для вас, или вы должны также установить его?
Эрик Блох
3
Я вообще не могу заставить это работать. У меня есть страница, на которую я пытаюсь разместить необработанные данные. Эта страница записывает все полученные необработанные данные в таблицу базы данных. Никаких новых строк нет. Вы знаете, изменилось ли здесь что-нибудь с 2009 года?
Джеймс
1
У меня это работает без указания HTTP-заголовка.
xryl669
12
Я только что понял, что тело здесь может включать любую допустимую строку json.
shasi kanth
1
Для этого необработанного сообщения существует ограничение в 2 ГБ. Если вы попытаетесь отправить файл размером более 2 ГБ, он будет обрезан до 2 ГБ. Это ограничение типа загружаемой строки.
Каден Йили
5

Реализация с библиотекой 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()
);

Расширение 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);

Исходный код

Сергей Андрийчук
источник