Guzzle http не отправляет json запрос на сервер

Guzzlehttp 7.4

Воспроизведение проблемы:

composer init composer require guzzlehttp/guzzle touch test.php

test.php

<?php    require 'vendor/autoload.php';
use GuzzleHttp\Client;

$client = new Client();

$response = $client->post('http://localhost:8000/dump.php', [
    GuzzleHttp\RequestOptions::JSON => ['foo' => 'bar'] // or 'json' => [...]
]);

touch dump.php

dump.php

<?php
        ob_start();
        var_dump($_GET,$_POST);
        $output = ob_get_clean();
        file_put_contents('log.txt', $output,FILE_APPEND);

php -S localhost:8000

php test.php

Ожидаемый результат (согласно документации):

Получить в log.txt json запрос отправленный методом POST

Получаемый результат:

  1. Запрос приходит, и тип запроса правильный

    [Sat Nov 13 19:08:33 2021] PHP 7.4.3 Development Server (http://localhost:8000) started [Sat Nov 13 19:09:16 2021] 127.0.0.1:51972 Accepted [Sat Nov 13 19:09:16 2021] 127.0.0.1:51972 [200]: POST /dump.php [Sat Nov 13 19:09:16 2021] 127.0.0.1:51972 Closing

Но cat log.txt

array(0) {
}
array(0) {
}

Пустой, я не смог найти решение на сайтах, все из перечисленного не отправляет json в теле запроса. Можете сказать что я делаю не так?


Ответы (1 шт):

Автор решения: Daniel Protopopov

Считаю это отчасти потому что

Веб-сервер предназначен для помощи в разработке приложений. Он также может быть полезным в тестовых целях или для демонстрации приложения, запускаемого в полностью контролируемом окружении. Он не выполняет функции полноценного веб-сервера и не должен использоваться в общедоступных сетях.

Вы можете использовать php://input для получения содержимого запроса во встроенном (и других) сервере.

Комментарий говорит что $_POST используется для данных формы, в него нельзя передавать JSON/XML. Подтвердил это, передав данные через form_params в Guzzle как массив - данные появились в $_POST. Для получения JSON используйте php://input.

→ Ссылка