file_get_contents ( "php : // input") 또는 $ HTTP_RAW_POST_DATA, JSON 요청의 본문을 가져 오는 것이 더 나은 것은 무엇입니까?


120

file_get_contents("php://input")또는 $HTTP_RAW_POST_DATA-JSON 요청의 본문을 얻는 데 어느 것이 더 낫습니까?

그리고 클라이언트 측을 사용할 때 JSON 데이터를 전송하려면 어떤 요청 유형 ( GET또는 POST)을 사용해야 XmlHTTPRequest합니까?

내 질문은이 답변에서 영감을 얻었습니다. 컬을 사용하여 JSON을 PHP에 게시하는 방법

그 대답에서 인용하십시오.

file_get_contents("php://input")어쨌든 실제로 http multipart 양식 데이터를 처리하지 않기 때문에 프로토콜 관점 에서 실제로 더 정확합니다.

답변:


195

실제로 php://input원시 POST 데이터를 읽을 수 있습니다.

$ HTTP_RAW_POST_DATA에 대한 메모리 집약적 인 대안이며 특별한 php.ini 지시문이 필요하지 않습니다 .

php://input에서는 사용할 수 없습니다 enctype="multipart/form-data".

참조 : http://php.net/manual/en/wrappers.php.php


12
또한 PHP 5.6부터는 $HTTP_RAW_POST_DATA더 이상 사용되지 않는 것으로 간주 php://input되며 재사용 할 수 있습니다.
Chris Forrence 2014-08-28

를 참조하십시오 enable_post_data_reading.
Pacerier

json_decode (file_get_contents ( 'php : // input'), true) URL에서 $ _GET 값을 얻기 위해 PHP 7.1에서이 기능이 지원됩니까?
Kailas

$ HTTP_RAW_POST_DATA는 PHP 7
Daniel

15

php : // input은 요청 본문에서 원시 데이터를 읽을 수 읽기 전용 스트림입니다. POST 요청의 경우 $ HTTP_RAW_POST_DATA 대신 php : // input을 사용하는 것이 좋습니다 . 특수 php.ini 지시문에 의존하지 않기 때문 입니다. 또한 $ HTTP_RAW_POST_DATA가 기본적으로 채워지지 않은 경우 always_populate_raw_post_data를 활성화하는 것보다 잠재적으로 메모리 집약적 인 대안입니다.

출처 : http://php.net/manual/en/wrappers.php.php .


4
또한 PHP 5.6부터는 $HTTP_RAW_POST_DATA더 이상 사용되지 않는 것으로 간주 php://input되며 재사용 할 수 있습니다.
Chris Forrence 2014-08-28

14

file_get_contents (php : // input)-원시 POST 데이터를 가져오고 API를 작성하고 PHP로 $ _POST로 디코딩 할 수없는 XML / JSON / ... 입력이 필요할 때 이것을 사용해야합니다 .

포스트 JSON 문자열로 보내기

<input type="button" value= "click" onclick="fn()">
<script>
 function fn(){


    var js_obj = {plugin: 'jquery-json', version: 2.3};

    var encoded = JSON.stringify( js_obj );

var data= encoded


    $.ajax({
  type: "POST",
  url: '1.php',
  data: data,
  success: function(data){
    console.log(data);
  }

});

    }
</script>

1. PHP

//print_r($_POST); //empty!!! don't work ... 
var_dump( file_get_contents('php://input'));

3

요청을 보내는 방법에는 일반적인 규칙이 적용됩니다. 요청이 정보 검색 (예 : 부분 검색 '힌트'결과 또는 표시 할 새 페이지 등) 인 경우 GET을 사용할 수 있습니다. 전송되는 데이터가 무언가 변경 (데이터베이스 업데이트, 레코드 삭제 등) 요청의 일부인 경우 POST를 사용합니다.

서버 측에서는 전체 post / get 데이터 블록을 한 번에 가져오고 싶지 않다면 원시 입력을 사용할 이유가 없습니다. 평소처럼 _GET / _POST 배열을 통해 원하는 특정 정보를 검색 할 수 있습니다. MooTools / jQuery와 같은 AJAX 라이브러리는 실제 AJAX 호출을 수행하고 양식 데이터를 적절한 형식으로 인코딩하는 어려운 부분을 처리합니다.


그게 요점입니다. JSON은 변수가없는 형식이기 때문에 한 번에 전체 게시 / 가져 오기 데이터 블록을 가져오고 싶습니다.
Manuel Bitto

@Kucebe 왜 이것이 필요한지 모르겠습니다. JSON 데이터를 POST 필드에 넣고 수행하지 않는 이유는 무엇입니까?
Pekka

전체 JSON 블록을 원하면 JSON 텍스트 블록을 양식 필드에 할당하고 그렇게 제출하지 않는 이유는 무엇입니까? <input type="hidden" name="data" value="json data here" />전적으로 허용되며 $ _REQUEST [ 'data']를 사용하여 서버 측에서 쉽게 검색 할 수 있습니다.
Marc B

3
POST 필드에 JSON을 포함하면 HTTP 콘텐츠 유형 태그의 목적이 무효화되고 Fiddler 및 브라우저 디버거 (JSON을 이해할 수 있음)에서 디버깅하는 데 적합하지 않습니다. 또한 많은 타사 JavaScript 라이브러리는 JSON 페이로드를 application / json으로 POST합니다.
CyberMonk

2

JSON 데이터의 경우 "application / json"콘텐츠 유형으로 게시하는 것이 훨씬 쉽습니다. GET을 사용하는 경우 매개 변수에서 JSON을 URL 인코딩해야하며 다소 지저분합니다. 또한 POST를 수행 할 때 크기 제한이 없습니다. 매우 제한된 경우 GET의 크기 (최대 4K).


2
POST에는 종종 크기 제한이 있지만 일반적으로 매우 높게 설정됩니다. 귀하의 확인 php.ini.
Brad

2

두 번째 질문은 간단합니다. GET은 서버와 브라우저 측 모두에서 크기 제한이 1 ~ 2 킬로바이트이므로 POST를 통해 전송해야하는 모든 종류의 더 많은 양의 데이터가 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.