Как получить тело сообщения в php?
Я отправляю как сообщение на страницу php следующее:
{a:1}
Это тело запроса (POST-запрос).
В PHP, что мне нужно сделать, чтобы извлечь это значение?
var_dump($_POST);
это не решение, не работает.
5 ответов
для доступа к телу сущности запроса POST или PUT (или любого другого метода HTTP):
$entityBody = file_get_contents('php://input');
и STDIN
константа-это уже открытый поток для php://input
, так что вы можете сделать:
$entityBody = stream_get_contents(STDIN);
С PHP ручной ввод в потоки ввода-выводаdocs:
php: / / input-это поток только для чтения, который позволяет читать необработанные данные из тела запроса. В случае POST-запросов, желательно использовать php: / / input вместо
$HTTP_RAW_POST_DATA
как это не зависит от специального php.ini-директивы. Кроме того, для тех случаев, когда$HTTP_RAW_POST_DATA
не заполняется по умолчанию, это потенциально менее интенсивная альтернатива активации памяти always_populate_raw_post_data. php: / / input не доступно с 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: / / input недоступен для запросов, указывающих (enctype="multipart/form-data"
в HTML-формах). Это результаты из PHP уже разобрав данные форма в $_POST
суперглобальная.
Если вы установили расширение HTTP PECL, вы можете использовать http_get_request_body()
функция для получения данных тела в виде строки.
Если у вас pecl / http расширение установлено, вы также можете использовать это:
$request = new http\Env\Request();
$request->getBody();