Как получить тело POST в php? - PullRequest
222 голосов
/ 20 января 2012

Я отправляю как POST на страницу php следующее:

{a:1}

Это тело запроса (запрос POST).
Что нужно сделать для извлечения в phpэто значение?

var_dump($_POST); 

не решение, не работает.

Ответы [ 7 ]

475 голосов
/ 20 января 2012

Чтобы получить доступ к телу объекта запроса POST или PUT (или любого другого метода HTTP):

$entityBody = file_get_contents('php://input');

Кроме того, константа STDIN - это уже открытый поток для php://input, так что вы можете сделать следующее:

$entityBody = stream_get_contents(STDIN);

Из ручной записи PHP для потоков ввода-вывода документы :

php: // input - это поток только для чтения, который позволяет читать необработанные данные из тела запроса. В случае запросов POST это предпочтительно использовать php: // input вместо $HTTP_RAW_POST_DATA, поскольку это не так зависит от специальных директив php.ini. Более того, для тех случаев, когда $HTTP_RAW_POST_DATA не заполняется по умолчанию, это потенциально менее интенсивная память альтернатива активации always_populate_raw_post_data. php: // input недоступно для ENCTYPE = "многочастному / форм-данных".

В частности, вы должны заметить, что поток 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 суперглобальном.

10 голосов
/ 16 марта 2016

Возможная причина для пустого $_POST состоит в том, что запрос не POST или больше не POST ... Возможно, он начинался как пост, но обнаружил перенаправление 301 или 302 где-то, что переключается на GET!

Проверьте $_SERVER['REQUEST_METHOD'], чтобы проверить, так ли это.

См. https://stackoverflow.com/a/19422232/109787 для хорошего обсуждения того, почему это не должно происходить, но все же происходит.

4 голосов
/ 12 марта 2019

возвращаемое значение в массиве

 $data = json_decode(file_get_contents('php://input'), true);
3 голосов
/ 14 января 2015

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

3 голосов
/ 20 января 2012
2 голосов
/ 23 апреля 2017

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

$request = new http\Env\Request();
$request->getBody();
1 голос
/ 09 ноября 2018

http_get_request_body() был явно сделан для получения тела запросов PUT и POST согласно документации http://php.net/manual/fa/function.http-get-request-body.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...