[php] PHP에서 POST 본문을 얻는 방법?

다음을 PHP 페이지에 POST로 제출합니다.

{a:1}

요청 본문입니다 (POST 요청).
PHP에서 그 값을 추출하려면 어떻게해야합니까?

var_dump($_POST); 

작동하지 않는 해결책이 아닙니다.



답변

POST 또는 PUT 요청의 엔티티 본문 (또는 다른 HTTP 메소드)에 액세스하려면 다음을 수행하십시오.

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

또한 STDIN상수는 이미 열린 스트림 php://input이므로 다음과 같이 할 수도 있습니다.

$entityBody = stream_get_contents(STDIN);

I / O 스트림 문서PHP 수동 항목에서 :

php : // input 은 요청 본문에서 원시 데이터를 읽을 수있는 읽기 전용 스트림입니다. POST 요청의 경우, 사용하는 것이 바람직하다 PHP : // 입력 하는 대신 $HTTP_RAW_POST_DATA이 특별한 php.ini의 지시에 의존하지 않는. 또한 $HTTP_RAW_POST_DATA기본적으로 채워지지 않은 경우
always_populate_raw_post_data를 활성화하는 것보다 메모리를 덜 사용하는 대안입니다. enctype = “multipart / form-data”에는 php : // input을 사용할 수 없습니다.

특히 당신은주의하는 것이 좋습니다 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 : // input은 Content-Type: multipart/form-data헤더를 지정하는 요청 ( enctype="multipart/form-data"HTML 형식)에 사용할 수 없습니다 . 이것은 PHP가 이미 폼 데이터를 $_POST슈퍼 글로벌 로 파싱 한 결과입니다 .


답변

배열의 반환 값

 $data = json_decode(file_get_contents('php://input'), true);


답변

비어있는 이유 $_POST는 요청이 아니 POST거나 POST더 이상 아니기 때문입니다 … 요청으로 시작되었지만 어딘가에 리디렉션 301되었거나 302이로 전환되었습니다 GET!

검사 $_SERVER['REQUEST_METHOD']이러한 경우 확인.

이것이 발생하지 않아야하지만 여전히 발생하는 이유에 대한 자세한 내용은 https://stackoverflow.com/a/19422232/109787 을 참조 하십시오 .


답변

변수 확인$HTTP_RAW_POST_DATA


답변

HTTP PECL 확장을 설치 한 경우 http_get_request_body()함수를 사용하여 본문 데이터를 문자열로 얻을 수 있습니다.


답변

당신이있는 경우 PECL을 / HTTP 확장 설치, 당신은이를 사용할 수 있습니다 :

$request = new http\Env\Request();
$request->getBody();


답변

function getPost()
{
    if(!empty($_POST))
    {
        // when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request
        // NOTE: if this is the case and $_POST is empty, check the variables_order in php.ini! - it must contain the letter P
        return $_POST;
    }

    // when using application/json as the HTTP Content-Type in the request 
    $post = json_decode(file_get_contents('php://input'), true);
    if(json_last_error() == JSON_ERROR_NONE)
    {
        return $post;
    }

    return [];
}

print_r(getPost());