복붙노트

PHP에서 POST의 시체를 얻는 방법?

PHP

PHP에서 POST의 시체를 얻는 방법?

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

{a:1}

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

var_dump($_POST); 

솔루션이 아니라 작동하지 않습니다.

해결법

  1. ==============================

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

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

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

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

    $entityBody = stream_get_contents(STDIN);
    

    I / O streamsdocs의 PHP 매뉴얼 항목에서 :

    특히 웹 SAPI에서 액세스하는 방법에 관계없이 php : // 입력 스트림을 찾을 수 없다는 점에 유의해야합니다. 즉, 한 번만 읽을 수 있습니다. 대형 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 요청 엔티티 본문을 한 번 읽는 것만으로도 충분합니다. 앱이 무엇을해야할지 생각하는 동안 클라이언트를 하루 종일 기다리게하지 마십시오.

    Content-Type : multipart / form-data 헤더 (HTML 형식에서는 enctype = "multipart / form-data")를 지정하는 요청에는 php : // input을 사용할 수 없습니다. 이것은 PHP가 이미 $ _POST 슈퍼 글로벌으로 양식 데이터를 파싱 한 결과입니다.

  2. ==============================

    2.빈 $ _POST에 대한 가능한 이유는 요청이 POST가 아니거나 POST가 아니기 때문입니다. 게시물로 시작했지만 301 또는 302 리디렉션이 GET으로 전환하는 데 필요합니다!

    빈 $ _POST에 대한 가능한 이유는 요청이 POST가 아니거나 POST가 아니기 때문입니다. 게시물로 시작했지만 301 또는 302 리디렉션이 GET으로 전환하는 데 필요합니다!

    이 경우에 $ _SERVER [ 'REQUEST_METHOD']를 검사하십시오.

  3. ==============================

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

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

  4. ==============================

    4.$ HTTP_RAW_POST_DATA 변수를 확인하십시오.

    $ HTTP_RAW_POST_DATA 변수를 확인하십시오.

  5. ==============================

    5.pecl / http 확장을 설치 한 경우 다음을 사용할 수도 있습니다.

    pecl / http 확장을 설치 한 경우 다음을 사용할 수도 있습니다.

    $request = new http\Env\Request();
    $request->getBody();
    
  6. from https://stackoverflow.com/questions/8945879/how-to-get-body-of-a-post-in-php by cc-by-sa and MIT license