Intereting Posts
Использование php для вывода видео mp4 Настройка firebase v3 custom auth с php Формы, сообщения и кнопки отправки php: '0' как строка с пустым () DatePicker: невозможно установить свойство «currentDay» неопределенного, когда идентификатор нескольких массивов При настройке переменных среды в директивах Apache RewriteRule, что заставляет имя переменной иметь префикс «REDIRECT_»? Изменение корневой папки через .htaccess Временная метка UNIX всегда в GMT? Сериализовать двумерный массив json, отправить два массива или другое? безопасно ли передавать данные через ajax? Magento: избегайте потери переводов при переписывании контроллеров Как вы используете bcrypt для хеширования паролей в PHP? PHP: переименуйте все файлы в нижний регистр в каталог рекурсивно Ошибка MYSQL: предупреждение: mysqli_fetch_assoc () ожидает, что параметр 1 будет mysqli_result, boolean given системное время отличается от временной отметки apache -?

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

Я отправляю в качестве 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();