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, використання тексту / звичайної форми та надсилання необроблених даних з $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
Я взагалі не можу змусити це працювати. У мене є сторінка, на яку я намагаюся розмістити необроблені дані. Ця сторінка записує всі необроблені дані, отримані в таблицю бази даних. Нових рядків взагалі немає. Чи знаєте ви, чи щось змінилося тут після '09?
Джеймс

1
Це працює для мене, не вказуючи жодного заголовка HTTP.
xryl669

12
Я щойно зрозумів, що тіло, що йде сюди, може включати будь-яку дійсну рядок json.
shasi kanth

1
Для цієї необробленої публікації існує обмеження 2G. Якщо ви спробуєте надіслати файл розміром більше 2G, вони будуть усічені назад до 2G. Це обмеження завантажуваного типу рядка.
Каден Єлі

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

Вихідний код

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.