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” => $data
  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 “レスポンス:”.var_dump($json_string);
  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 “レスポンス:”.var_dump($json_string);
  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 “レスポンス:”.var_dump($json_string)
  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」では形式が合わず取得が出来なくなるためと思われます。


この記事へのコメント

    • Shin さん
      2019年6月7日 4:36 PM
    • 返信

    PHPもJSONも分からずで、参考にさせて頂きました。 とても、参考になりましたが、無知の悲しさ、結構はまりました。
    たぶん、一か所、間違いが有ると思います。
    // コンテキストオプションセット
    $options = array(
    “http” => array(
    “method” => “POST”,
    “header” => “Content-type: application/json; charset=UTF-8”,
    “content” => $contents
    )
    );
    ですが、最後の”content” => $contents は、
    “content” => $data では? ブラウザで、動かすと、変数未定義エラーが出ないので…

      • モリヤ さん
        2019年7月18日 11:54 AM

      Shin さん

      ご指摘ありがとうございます!

      おっしゃる通り「”content” => $data」ですね。。

      記述修正しました。

コメントをどうぞ

技術の記事

  1. mac-459196__340
    WordPressで出力内容が動的に変わる固定ページの<title>を変更
  2. startup-593296_960_720
    XAMPPのローカル環境を同じ社内LAN内の別PCからアクセスする方法
  3. 呪文
    実は俺、、、ホイミ使えます。
  4. printscreenFTHG9249_TP_V
    JSON形式でPOSTされたデータの受信方法