Initial Site

Initial Site

Initial Site

JSON形式でPOSTされたデータの受信方法

  • モリヤ  2019/03/06 12:20
printscreenFTHG9249_TP_V

こんにちは
開発部のモリヤです。

WebAPIなどを使用した際に、JSON形式でPOST送信されたパラメータを受信する方法についてご紹介いたします。
 

送信処理
  1. <?php
  2. $data = array(
  3.   “id” => “value1”,
  4.   “name” => “value2”
  5. );
  6. // JSON形式に変換
  7. $data = json_encode($data);
  8. // コンテキストオプションセット
  9. $options = array(
  10.   “http” => array(
  11.     “method” => “POST”,
  12.     “header” => “Content-type: application/json; charset=UTF-8”,
  13.     “content” => $contents
  14.   )
  15. );
  16. // ストリームコンテキスト生成
  17. $context = stream_context_create($options);
  18. // POST送信
  19. $result = file_get_contents(‘http://localhost/api/test.php’, false, $context);
  20. // レスポンス表示
  21. echo $result;
  22. ?>

 

失敗:「$_POST」で受信

受信処理
  1. <?php
  2. $json_string = $_POST;
  3. echo “受信結果:”.$json_string.”<br>”;
  4. echo “レスポンス:”;
  5. $contents = json_decode($json_string);
  6. print_r($contents);
  7. ?>
出力結果
  1. 受信結果:Array
  2. レスポンス:

 
PHP標準の「$_POST」で取得しようとすると中身が空の配列取得となり、正常にデータが取得できません。
 
 

非推奨:「$HTTP_RAW_POST_DATA」で受信

受信処理
  1. <?php
  2. // php.iniの「always_populate_raw_post_data」が有効である場合使用可
  3. $json_string = $HTTP_RAW_POST_DATA;
  4. echo “受信結果:”.$json_string.”<br>”;
  5. echo “レスポンス:”;
  6. $contents = json_decode($json_string);
  7. print_r($contents);
  8. ?>
出力結果
  1. 受信結果:{“id”:”value1″,”name”:”value2″}
  2. レスポンス:stdClass Object ( [id] => value1 [name] => value2 )

 
「$HTTP_RAW_POST_DATA」で生のPOSTデータを取得します。
ただこちらはPHP 5.6.0 で 非推奨 となり、 PHP 7.0.0 で 削除となるため、使用すべきではありません。
より正確に言うと、「$HTTP_RAW_POST_DATA」が非推奨となる要因として、php.ini内にある生のPOSTデータへのアクセス可否を定義する「always_populate_raw_post_data」項目がPHP 7.0.0 で削除となるためとなります。
>> コア php.ini ディレクティブに関する説明
 
 

推奨:「file_get_contents(‘php://input’)」で受信

受信処理
  1. <?php
  2. $json_string = file_get_contents(‘php://input’);
  3. echo “受信結果:”.$json_string.”<br>”;
  4. echo “レスポンス:”;
  5. $contents = json_decode($json_string);
  6. print_r($contents);
  7. ?>
出力結果
  1. 受信結果:{“id”:”value1″,”name”:”value2″}
  2. レスポンス:stdClass Object ( [id] => value1 [name] => value2 )

 
PHP 5.6.0 以降で推奨される取得方法「file_get_contents(‘php://input’)」での取得結果となります。
問題なくPOSTされたJSON形式データが取得できています。
 
 

何故、生のPOSTデータを取得する必要があるのか?

通常のPOSTデータはKeyとValueの組み合わせによる連想配列の形式出来となりますが、JSON形式に変換することで文字列のみとなり、標準の「$_POST」では形式が合わず取得が出来なくなるためと思われます。


コメントをどうぞ

技術の記事

  1. 呪文
    実は俺、、、ホイミ使えます。
  2. printscreenFTHG9249_TP_V
    JSON形式でPOSTされたデータの受信方法
  3. stressed-elderly-old-man-using-260nw-307307456
    Eclipse でSVNを使っていたら色々と大変だった話
  4. 少しだけ試行錯誤しつつ…も、簡単にできます
    シネマグラフを作ってみた