Я отправляю в качестве POST на php-страницу следующее:
{a:1}
Это тело запроса (запрос POST).
В php, что мне нужно сделать, чтобы извлечь это значение?
var_dump($_POST);
не является решением, а не работает.
Для доступа к сущности тела запроса POST или PUT (или любого другого метода HTTP):
$entityBody = file_get_contents('php://input');
Кроме того, константа STDIN
является уже открытым потоком к php://input
, поэтому вы также можете:
$entityBody = stream_get_contents(STDIN);
Из руководства по PHP в потоках ввода-вывода docs :
php: // input – это поток только для чтения, который позволяет вам считывать необработанные данные из тела запроса. В случае запросов POST предпочтительнее использовать вход php: // вместо
$HTTP_RAW_POST_DATA
поскольку он не зависит от специальных директив php.ini. Более того, для тех случаев, когда по умолчанию$HTTP_RAW_POST_DATA
не заполняется по умолчанию, это потенциально менее энергоемкая альтернатива активации always_populate_raw_post_data. php: // вход не доступен с enctype = "multipart / form-data".
В частности, вы хотите отметить, что поток php://input
, независимо от того, как вы обращаетесь к нему в веб-SAPI, не доступен для поиска . Это означает, что его можно прочитать только один раз. Если вы работаете в среде, где обычно загружаются большие тела объектов HTTP, вы можете сохранить ввод в форме потока (а не буферизировать его, как в первом примере выше).
Для поддержания ресурса потока может быть полезно что-то вроде этого:
<?php function detectRequestBody() { $rawInput = fopen('php://input', 'r'); $tempStream = fopen('php://temp', 'r+'); stream_copy_to_stream($rawInput, $tempStream); rewind($tempStream); return $tempStream; }
php://temp
позволяет вам управлять потреблением памяти, поскольку он будет прозрачно переключиться на хранение в файловой системе после хранения определенного объема данных (по умолчанию 2M). Этот размер можно обрабатывать в файле php.ini или путем добавления /maxmemory:NN
, где NN
– это максимальный объем данных для хранения в памяти перед использованием временного файла в байтах.
Конечно, если у вас нет действительно веских оснований для поиска по входному потоку, вам не нужна эта функциональность в веб-приложении. Чтение тела объекта запроса HTTP один раз обычно достаточно – не заставляйте клиентов ждать весь день, пока ваше приложение выясняет, что делать.
Обратите внимание, что вход php: // недоступен для запросов, определяющих заголовок Content-Type: multipart/form-data
( enctype="multipart/form-data"
в HTML-формах). Это связано с тем, что PHP уже проанализировал данные формы в $_POST
.
Возможная причина для пустого $_POST
заключается в том, что запрос не является POST
, или не POST
больше … Возможно, он начинался как сообщение, но где-то встречался перенаправление 301
или 302
, которое требуется для переключения на GET
!
Осмотрите $_SERVER['REQUEST_METHOD']
чтобы проверить, так ли это.
Проверьте переменную $HTTP_RAW_POST_DATA
Если вы установили расширение HTTP PECL, вы можете использовать http_get_request_body()
чтобы получить данные тела как строку.
Если у вас установлено расширение pecl / http , вы также можете использовать это:
$request = new http\Env\Request(); $request->getBody();