Php post body data

Как получить тело POST в php?

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

В частности, вы хотите отметить, что поток php://input , независимо от того, как вы обращаетесь к нему в веб-SAPI, не доступен для поиска. Это означает, что его можно прочитать только один раз. Если вы работаете в среде, где обычно загружаются большие тела объектов HTTP, вы можете сохранить ввод в форме потока (а не буферизировать его, как в первом примере выше). Для поддержания ресурса потока может быть полезно что-то вроде этого:

php://temp позволяет вам управлять потреблением памяти, поскольку он будет прозрачно переключаться на хранилище файловой системы после хранения определенного объема данных (по умолчанию 2M). Этот размер можно обрабатывать в файле php.ini или путем добавления /maxmemory:NN , где NN — это максимальный объем данных для хранения в памяти перед использованием временного файла в байтах. Конечно, если у вас нет действительно веских оснований для поиска входного потока, вам не нужна эта функциональность в веб-приложении. Чтение тела объекта запроса HTTP один раз обычно достаточно — не заставляйте клиентов ждать весь день, пока ваше приложение выясняет, что делать. Обратите внимание, что вход php://недоступен для запросов, определяющих заголовок Content-Type: multipart/form-data ( enctype=»multipart/form-data» в HTML-формах). Это связано с тем, что PHP уже проанализировал данные формы в суперглобальном $_POST .

Обратите внимание, что на самом деле поток STDIN недоступен в системах, использующих PHP с использованием CGI, то есть через mod_fcgid или mod_fastcgi и т. Д.

но, я передаю переменную (как данные формы) с запросом, как я могу получить доступ к указанному значению, я передаю grant_type = пароль и имя пользователя = user & пароль = передать как тело формы данных с запросом, как я получу grant_type из «$ entityBody»

Читайте также:  Ввод значений в строку python

согласно моему тесту, этот php://input пуст для содержимого содержимого application/x-www-form-urlencoded (кроме multipart/form-data )

Чтобы расширить ответ @scy’s scy: STDIN недоступен, но php://input есть. Таким образом, в то время как на (быстрой) конфигурации CGI stream_get_contents(STDIN) не будет работать, file_get_contents(«php://input») будет работать.

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

Осмотрите $_SERVER[‘REQUEST_METHOD’] , чтобы убедиться, что это так.

Я не уверен, что вы имеете в виду? REST API может также найти редиректы на своем пути, это проблема, с которой я столкнулся.

Я имел в виду, когда я задавал вопрос, я не пытался устранить ошибку, а пытался выяснить, как ее развить.

этот намек спас мой день. принимающий сервер был перенастроен для перенаправления на https, который сломал некоторые клиенты API.

На самом деле мой запрос был POST но после проверки он показал, что это GET . Как только я добавил / в конце моего URL, он начал показывать POST. Weird!

Источник

PHP: Receive raw POST data.

This is a short guide on how to receive raw POST data in PHP. This is useful if you intend on receiving JSON or XML via a POST request.

In most day-to-day cases, we tend to access POST data like so:

//Retrieving a POST field in PHP $name = $_POST['name'];

However, in certain cases, you may need to access the POST request’s body as a whole. In those cases, you will need to access the php://input stream.

The php://input stream.

PHP has a number of I/O streams that you can access. In this case, we are particularly interested in the php://input stream.

Читайте также:  Html div align text middle

Take a look at the following example:

//Get the raw POST data $postBody = file_get_contents("php://input");

In the code above, we used the file_get_contents function to read the php://input stream into a PHP variable called $postBody.

If a POST request is sent to the script above, the entire body of the request will be assigned to the $postBody variable.

For example: When I sent three POST parameters to the script in question, the php://input stream returned the following string:

Note that if no POST data is present, the code above will return a blank string.

Don’t use $HTTP_RAW_POST_DATA.

$HTTP_RAW_POST_DATA is a predefined PHP variable that can be configured to contain raw POST data. However, the variable was officially deprecated in PHP 5.6 and completely removed as of PHP 7.0.

Besides the fact that it is no longer supported, there is also the drawback of having to mess around with .ini directives in order to get it working. This is because the feature is turned off by default on most PHP installations.

The feature relies on the always_populate_raw_post_data directive being set to 1. However, the default value for this directive is 0 (off).

Long story short: You should use the input stream approach instead.

Источник

Как получить тело POST в php?

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

Это тело запроса (запрос POST).
В php, что мне нужно сделать, чтобы извлечь это значение?

не является решением, а не работает.

Для доступа к сущности тела запроса 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 set names utf8mb4

Для поддержания ресурса потока может быть полезно что-то вроде этого:

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(); 

Источник

Оцените статью