Как получить тело сообщения в 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 суперглобальная.


возможная причина пустой $_POST Это то, что запрос не POST или не


Если вы установили расширение HTTP PECL, вы можете использовать http_get_request_body() функция для получения данных тела в виде строки.



Если у вас pecl / http расширение установлено, вы также можете использовать это:

$request = new http\Env\Request();
$request->getBody();