Я отправляю POST на страницу php следующее:
Это тело запроса (запрос POST).
Что мне нужно сделать в php, чтобы извлечь это значение?
var_dump($_POST);
Этот код не работает.
Ответ 1
Чтобы получить доступ к содержимому объекта запроса POST или PUT (или любого другого метода HTTP):
$entityBody = file_get_contents('php://input');
Кроме того, STDIN константа — это уже открытый поток php://input, поэтому вы можете в качестве альтернативы сделать:
$entityBody = stream_get_contents(STDIN);
Из документации PHP по потокам ввода-вывода:
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.
Ответ 2
Возможное решение:
function getPost() {
if(!empty($_POST)) {
// когда в качестве HTTP Content-Type в запросе используется application/x-www-form-urlencoded или multipart/form-data
// ПРИМЕЧАНИЕ: если это так и $_POST пуст, можно проверить порядок переменных (variables_order) в php.ini! - они должны содержать букву P
return $_POST;
}
// при использовании application/json в качестве HTTP Content-Type в запросе
$post = json_decode(file_get_contents('php://input'), true);
if(json_last_error() == JSON_ERROR_NONE) {
return $post;
}
return [];
}
print_r(getPost());
Ответ 3
Этот пример о том, как создать PHP API с file_get_contents("php://input"), и об использовании с javascript в связке с ajax XMLHttpRequest.
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
console.log("done");
}
}
};
xhttp.open("POST", "http://127.0.0.1:8000/api.php", true);
xhttp.send(JSON.stringify({
username: $(this).val(),
email:email,
password:password
}));
$data = json_decode(file_get_contents("php://input"));
$username = $data->username;
$email = $data->email;
$password = $data->password;
Web