PHPでJSON POSTを受信する


292

支払いインターフェイスのウェブサイトで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)言うの?空の配列ですか?
セルジュパラシフ2013

3
$ _POSTには、「&」で区切られた投稿リクエストの辞書があります。jsonの$ _POSTは間違いなく機能しません。file_get_contents( 'php:// input')を印刷できますか?また、var_dump($ data-> operation); またはvar_dump($ data-> operacion); ?
Akshaya Shanbhogue 2013

4
JSONはテキストですが、POSTでアクセスできないのはなぜですか?支払いサービスがそのテキストをPHPエンドポイントにPOSTする限り、彼はそれを実行できるはずjson_decodeです。しかし、おそらくサービスはリクエスト本文でデータを送信します。これは別の話であり、そうfile_get_contents('php://input')すれば動作します。
セルジュパラシフ2013

1
もしそうなら、これは、ここで議論されている:stackoverflow.com/questions/8945879/...
はSergiu Paraschiv

3
$ _POST:リクエストでHTTP Content-Typeとしてapplication / x-www-form-urlencodedまたはmultipart / form-dataを使用する 場合、HTTP POSTメソッドを介して現在のスクリプトに渡される変数の連想配列application / jsonを使用する場合はそうではありません。
クリスティアンセプルベダ

回答:


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
それが価値があるもののために、オペラシオンはスペイン語の綴り(与えるかアクセントを取る)です。
Patrick

11
彼の要点は、彼が両方の場所で、操作または両方の場所での操作のいずれかで、それを正しく綴っていなかったということでした。
msj121 2013

2
PHP 5.6より前のバージョンでは、php:// inputのコンテンツの取得は一度しか実行できませんでした。あなたのコードまたはフレームワークは以前にそれをどこかに開いていましたか?
aljo f 2015

90

たとえば、すでに$ _POST ['eg']のようにパラメーターを設定していて、それを変更したくない場合は、次のようにします。

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

これにより、すべての$ _POSTを別の$ _POSTに変更する手間が省け、この行を削除したい場合でも通常の投稿リクエストを行うことができます。


1
ありがとうございます。私の場合、AndroidからPHPへのJSON投稿を行っているため、これはうまくいきました
vanurag

ありがとう、私の場合はうまくいきました。$ _POSTデータを$ request変数に割り当てていましたが、今はその変数にphp:// inputのコンテンツを割り当てています。
Funder

これはちょうど私の日をとても簡単にしました。ありがとう。
タイラーマモン

47

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の結果をオプションで入力するように関数を拡張することができます。これにより、解析が不要になります。整形式の入力に対して2回実行されます。
かすかな信号

4
このようにして、実際にjsonを2回デコードします。それは高価です。最初のデコードでは、デコードされた値をすぐに保存し、後でチェックして(json_last_error()== JSON_ERROR_NONE)、すべてが正常であれば処理を続行します[その他の場合は失敗します]
kakoma

@kakoma、間違いなく!これはシンプルさを念頭に置いて書かれました。教育目的では、多くの場合、効率よりも単純さの方が重要です。:)
XtraSimplicity

1
そうだね。教育目的のため。明確化をありがとう@XtraSimplicity Ha、それはあなたの名前にもあります:-)
kakoma '27

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 Basnet

2
私にとってはこの一般的な答え[use $ json = file_get_contents( 'php:// input'); ] JSONが[]のように最も外側の「コンテナ文字」で送信されているときに機能しないことがわかりました。RAW_POST_DATAを使用したここでのこの答えは私にとってはトリックでした。そして、私の現在のPHPスタックで問題ありません。私はしばらく立ち往生していました...この解決策を本当にありがとう!
Gene Bo

これはまだかなり最新のものです。GitLabWebhook(たとえば)の場合は、を使用する必要があります$HTTP_RAW_POST_DATA
developius

私は解決策を探して探しましたが、あなたのバイケルバスネットが私のために働いてくれました。ありがとう!
スクーター2017年

これにより、Angular 2のHttpClientがタイプContent-Typeのリクエストを送信することからPOST変数をキャッチする方法を検討する3日間を節約できました:application / json
Frederick G. 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(そしてすべての反対者への)私の答えは、他の人の要約にすぎません。そして、私が書いたように、ユースケース(mpdf)。これを書いている時点で、私は方法を理解しようとしていたときに、このような答えを見たいと思っていました。そして、私の2番目のスニペットは確かに答えではありません。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.