Web

Как получить содержимое POST на php?

Я отправляю 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-dataenctype="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

Получение разрешения экрана с помощью PHP

Как обойти блокировку интернета на работе и зайти на нужные сайты?
Web

Как обойти блокировку интернета на работе и зайти на нужные сайты?

Web

Какие шаблоны существуют в проекте PHP для хранения, доступа и организации вспомогательных объектов?

Web

Как разрешить неоднозначные имена столбцов при получении результатов?

×