2012-01-17 5 views
149

JQuery에서 Ajax 요청과 상호 작용할 때 $_POST 대신 php://input 메서드를 사용하도록 지시되었습니다. 내가 이해할 수없는 것은 이것을 사용하는 것의 이점이 글로벌 방법 $_POST 또는 $_GET 인 것입니다.

답변

299

이유는 콘텐츠 유형에 관계없이 php://input이 요청의 HTTP 헤더 뒤에 모든 원시 데이터를 반환하기 때문입니다.

는 PHP 슈퍼 전역 $_POST가 만 가있다 랩 데이터 중

  • application/x-www-form-urlencoded (간단한 양식 - 게시물에 대한 표준 콘텐츠 형식) 또는
  • multipart/form-data-encoded
  • 로 가정된다 (대부분 파일 업로드에 사용)

이것은 유일한 콘텐츠 유형이 must be supported by user agents이기 때문입니다. 따라서 서버와 PHP는 전통적으로 다른 컨텐츠 유형을 기대하지 않습니다 (그렇다고해도 그렇지 못하다는 의미는 아닙니다). 당신은 단순히 좋은 오래된 HTML form를 POST 경우

따라서, 요청은 다음과 같이 보입니다 :

POST /page.php HTTP/1.1 

key1=value1&key2=value2&key3=value3 

을하지만 Ajax를 많이 작업하는 경우,이 probaby도 유형보다 복잡한 데이터를 교환 포함 (string, int, bool) 및 구조체 (배열, 객체)를 사용하므로 대부분의 경우 JSON이 최선의 선택입니다. 그러나 JSON 페이로드와 요구는 다음과 같이 보일 것입니다 :

POST /page.php HTTP/1.1 

{"key1":"value1","key2":"value2","key3":"value3"} 

내용은 지금 것 application/json (또는 위에서 언급 한의 이상 없음), 그렇게 처리하는 방법을 알고하지 않습니다 -wrapper PHP의 $_POST 그 (아직).

데이터가 여전히 존재하므로 래퍼를 통해 액세스 할 수 없습니다. 따라서 file_get_contents('php://input') (as long as it's not multipart/form-data-encoded)을 원시 형식으로 직접 가져와야합니다.

XML 데이터 또는 기타 비표준 콘텐츠 형식에 액세스하는 방법이기도합니다.

+20

+1 "XML 데이터 또는 다른 비표준 콘텐츠 유형에 액세스하는 방법" – mandza

+0

@Quasdank Android 앱에서 JSON을 PHP xampp 서버로 클라우드에 전송합니다 (http://stackoverflow.com/). 질문/36558261/json-from-from-compute-engine-servers-returns-null)하지만 file_get_contents ('php : // input')를 시도했을 때 제대로 작동하지 않습니다. 문자열 (0). 이것은 로컬 컴퓨터에서 작동하는 데 사용되었지만 클라우드에 배포 한 경우에는 작동하지 않습니다. 제발 도와 주실 수 있나요? –

26

php://input은 데이터의 원시 바이트를 줄 수 있습니다. POST 된 데이터가 AJAX POST 요청의 경우 인 JSON 인코딩 구조 인 경우 유용합니다.

여기에 그냥 할 수있는 기능 : 당신은 기존의 POST 제출 한 형태에서 키 - 값 데이터를 처리 할 때

/** 
    * Returns the JSON encoded POST data, if any, as an object. 
    * 
    * @return Object|null 
    */ 
    private function retrieveJsonPostData() 
    { 
    // get the raw POST data 
    $rawData = file_get_contents("php://input"); 

    // this returns null if not valid json 
    return json_decode($rawData); 
    } 

$_POST 배열이 더 유용하다. POST 된 데이터가 인식 된 형식 인 경우 일반적으로 application/x-www-form-urlencoded입니다 (자세한 내용은 http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4 참조).

+2

'json_decode'의 두 번째 매개 변수로 'true'를 전달하면 연관 배열이 반환됩니다. – VSG24

18

게시물 데이터 형식이 잘못되면 $ _POST에 아무 것도 포함되지 않습니다. 그러나 php : // 입력은 잘못된 형식의 문자열을가집니다.

예를 들어, 파일을 업로드하기위한 올바른 키 - 값 순서를 구성하지 않고 변수 이름이나 기타없이 모든 파일을 게시 데이터로 덤프하는 일부 아약스 응용 프로그램이 있습니다. $ _POST는 비어 있고 $ _FILES도 비어 있으며 php : // input은 문자열로 쓰여진 정확한 파일을 포함합니다.