PHP로 JSON POST 받기


291

결제 인터페이스 웹 사이트에서 JSON POST를 수신하려고하는데 디코딩 할 수 없습니다.

인쇄 할 때 :

echo $_POST;

나는 얻다:

Array

이것을 시도해도 아무것도 얻지 못합니다.

if ( $_POST ) {
    foreach ( $_POST as $key => $value ) {
        echo "llave: ".$key."- Valor:".$value."<br />";
    }
}

이것을 시도해도 아무것도 얻지 못합니다.

$string = $_POST['operation'];
$var = json_decode($string);
echo $var;

이것을 시도하면 NULL을 얻습니다.

$data = json_decode( file_get_contents('php://input') );
var_dump( $data->operation );

내가 할 때 :

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

나는 얻다:

NULL

JSON 형식은 다음과 같습니다 (결제 사이트 문서에 따라).

{
   "operacion": {
       "tok": "[generated token]",
       "shop_id": "12313",
       "respuesta": "S",
       "respuesta_details": "respuesta S",
       "extended_respuesta_description": "respuesta extendida",
       "moneda": "PYG",
       "monto": "10100.00",
       "authorization_number": "123456",
       "ticket_number": "123456789123456",
       "response_code": "00",
       "response_description": "Transacción aprobada.",
       "security_information": {
           "customer_ip": "123.123.123.123",
           "card_source": "I",
           "card_country": "Croacia",
           "version": "0.3",
           "risk_index": "0"
       }
    }
}

결제 사이트 로그에 모든 것이 정상이라고 표시됩니다. 뭐가 문제 야?


4
무엇합니까 var_dump($_POST)말은? 빈 배열입니까?
Sergiu Paraschiv

3
$ _POST에는 "&"로 구분 된 게시물 요청 사전이 있습니다. json의 $ _POST는 확실히 작동하지 않습니다. file_get_contents ( 'php : // input')를 인쇄 할 수 있습니까? 또한 var_dump ($ data-> operation); 또는 var_dump ($ data-> operacion); ?
Akshaya Shanbhogue

4
JSON은 텍스트이므로 POST에서 액세스 할 수없는 이유는 무엇입니까? 지불 서비스가 해당 텍스트를 자신의 PHP 엔드 포인트에 게시하는 한 가능 json_decode합니다. 그러나 서비스가 request body 에서 데이터를 전송 하는 것은 다른 이야기이며 file_get_contents('php://input')그래야 작동합니다.
Sergiu Paraschiv

1
그렇다면 여기에서 논의되었습니다 : stackoverflow.com/questions/8945879/…
Sergiu Paraschiv

3
$ _POST : 요청에서 HTTP Content-Type으로 application / x-www-form-urlencoded 또는 multipart / form-data를 사용할 때 HTTP POST 메소드를 통해 현재 스크립트에 전달 된 변수의 연관 배열 . application / json을 사용할 때는 아닙니다.
Cristian Sepulveda

답변:


476

시험;

$data = json_decode(file_get_contents('php://input'), true);
print_r($data);
echo $data["operacion"];

당신의 json과 코드에서, 당신이 끝에 단어 연산을 올바르게 철자 한 것처럼 보이지만 json에는 없습니다.

편집하다

아마도 php : // input에서 json 문자열을 에코하려고 시도 할 가치가 있습니다.

echo file_get_contents('php://input');

2
안녕하세요 두 경우 모두 화면에 아무것도 표시되지 않습니다
Pablo Ramirez

6
가치있는 일을 위해, operacion은 스페인어의 철자 (주거나 강조하기)입니다.
Patrick

11
그의 요점은 그가 두 곳 모두에서 정확하게 철자를 쓰지 않았다는 것입니다.
msj121

2
PHP 5.6 이전에는 php : // input의 내용을 한 번만 얻을 수있었습니다. 코드 나 프레임 워크가 전에 어딘가에 열었을 수 있습니까?
aljo f

90

예를 들어 $ _POST [ 'eg']와 같은 매개 변수가 이미 설정되어 있고 변경하지 않으려면 다음과 같이하십시오.

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

이렇게하면 모든 $ _POST를 다른 것으로 변경하는 번거 로움을 덜고이 라인을 꺼내고 싶을 때 정상적인 포스트 요청을 할 수 있습니다.


1
감사합니다. 안드로이드에서 PHP로 json 게시를 할 때 이것은 내 경우에 효과적이었습니다!
vanurag

고맙습니다. 제 경우에는 효과가있었습니다. 나는 $ _POST 데이터를 $ request 변수에 할당하고 있었고, 이제 그 변수에 php : // input의 내용을 할당했습니다.
Funder

이것은 내 하루를 훨씬 더 쉽게 만들었습니다. 감사.
Tyler Mammone

46

json_decode(file_get_contents("php://input"))다른 사람들이 언급했듯이 사용 하면 문자열이 유효한 JSON 이 아닌 경우 실패합니다 .

JSON이 유효한지 먼저 확인하여 간단히 해결할 수 있습니다. 즉

function isValidJSON($str) {
   json_decode($str);
   return json_last_error() == JSON_ERROR_NONE;
}

$json_params = file_get_contents("php://input");

if (strlen($json_params) > 0 && isValidJSON($json_params))
  $decoded_params = json_decode($json_params);

편집 : 제거하는 것을 참고 strlen($json_params)로 위의 것은 미묘한 오류가 발생할 수 있습니다 json_last_error()않습니다 되지 때 변경 null빈 문자열이 전달됩니다 또는 다음과 같이 : http://ideone.com/va3u8U


2
누군가가 입력 및 / 또는 많은 양의 요청에서 다소 많은 양의 데이터를 기대하는 경우 제공된 변수 참조를 선택적으로 json_decode의 결과로 채우도록 함수를 확장하여 구문 분석 할 필요가 없습니다. 올바르게 구성된 입력에서 두 번 수행됩니다.
faintsignal 1

4
이 방법으로 실제로 json을 두 번 디코딩합니다. 그건 비싸군요. 첫 번째 디코드를 사용하면 디코드 된 값을 즉시 저장하고 나중에 확인 (json_last_error () == JSON_ERROR_NONE) 한 다음 모든 것이
정상인

@kakoma, 가장 확실하게! 이것은 단순성을 염두에두고 작성되었습니다. 교육 목적 상 단순성은 효율성보다 더 중요합니다. :)
XtraSimplicity

1
진실. 교육 목적. 설명 @XtraSimplicity Ha에 감사드립니다, 그것은 당신의 이름에도 있습니다 :-)
kakoma

37

$HTTP_RAW_POST_DATA대신에 사용하십시오 $_POST.

POST 데이터를 그대로 제공합니다.

json_decode()나중에 사용하여 디코딩 할 수 있습니다 .


45
$ HTTP_RAW_POST_DATA 이제 감가 상각 때문에 당신은 JSON POST를 읽기 위해이 방법으로 사용할 수 있습니다$json = file_get_contents('php://input'); $obj = json_decode($json);
Bikal 바스 넷

2
나 에게이 일반적인 대답 [use $ json = file_get_contents ( 'php : // input'); ] JSON이 []와 같이 가장 외부의 "컨테이너 문자"와 함께 전송 될 때 작동하지 않는 것으로 나타났습니다. RAW_POST_DATA가있는이 대답은 나를 위해 속였습니다. 그리고 현재 PHP 스택으로 괜찮습니다. 나는 잠시 동안 붙어 있었다..이 해결책을위한 대단히 감사합니다!
Gene Bo

GitLab후크 (예 :)의 경우 에는 여전히 최신 상태 $HTTP_RAW_POST_DATA입니다.
developius

나는 해결책을 찾고 검색했고 Bikel Basnet은 당신을 위해 일했다. 감사!
Scooter

응용 프로그램 / JSON이 내 삼일 유형의 콘텐츠 형식으로 요청 보내는 HttpClient를 각도 (2)에서 POST 변수를 잡을 수있는 방법을 모색 저장
프레드릭 지 Sandalo을


8
$data = file_get_contents('php://input');
echo $data;

이것은 나를 위해 일했습니다.


-5

curl을 사용하여 내용을 가져오고 mpdf 를 사용하여 결과를 pdf로 저장 하는 답변을 게시하고 싶습니다 . 그것은 원시 코드 일 뿐이므로 (필요에 맞게) 작동합니다.

// import mpdf somewhere
require_once dirname(__FILE__) . '/mpdf/vendor/autoload.php';

// get mpdf instance
$mpdf = new \Mpdf\Mpdf();

// src php file
$mysrcfile = 'http://www.somesite.com/somedir/mysrcfile.php';
// where we want to save the pdf
$mydestination = 'http://www.somesite.com/somedir/mypdffile.pdf';

// encode $_POST data to json
$json = json_encode($_POST);

// init curl > pass the url of the php file we want to pass 
// data to and then print out to pdf
$ch = curl_init($mysrcfile);

// tell not to echo the results
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1 );

// set the proper headers
curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen($json) ]);

// pass the json data to $mysrcfile
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);

// exec curl and save results
$html = curl_exec($ch);

curl_close($ch);

// parse html and then save to a pdf file
$mpdf->WriteHTML($html);
$this->mpdf->Output($mydestination, \Mpdf\Output\Destination::FILE);

$ mysrcfile에서 다음과 같은 json 데이터를 읽을 것입니다 (이전 답변에서 언급했듯이).

$data = json_decode(file_get_contents('php://input'));
// (then process it and build the page source)

1
쓸모없는 정보가 너무 많습니다. 첫 번째 코드는 무엇을합니까? 두 번째 발췌 문장은 정답입니다.
Fipsi

@Fipsi (그리고 모든 downvoters에게) 내 대답은 다른 사람들의 개론 일뿐입니다. 그리고 내가 쓴 것처럼 유스 케이스 (mpdf). 글을 쓰는 시점에서 나는 방법을 알아 내려고 할 때 이와 같은 대답을 보는 것을 좋아했을 것입니다. 그리고 두 번째 스 니펫은 확실히 대답이 아닙니다 .json 데이터를 수신하려면 데이터도 올바르게 전송해야하며 더 많은 전송 방법이있을뿐만 아니라 종종 방법이 정확히 실제 문제입니다. 이 경우 포커스는 json_decode가 아니라 대신 무언가를 올바르게 얻는 방법입니다 file_get_contents('php://input').
Luca Reghellin

2
나는 공감하지 않았고 당신의 의도를 이해합니다. 그러나 문제는 'JSON 보내기'가 아니라 'JSON 받기'입니다. OP에서 수신에 문제가 있고 실제로 전송에 관심이 없다는 질문에서 분명히 알 수 있습니다.
Fipsi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.