周辺知識

file_get_contents を使って JSON を送信

前回、PHPでPOST送信を行いました。

ただ、実際のWeb APIでは送信データはJSON形式でやり取りすることが多いです。

なので、今回はJSON形式でPOST送信してみます。

 

サンプルソースコード

データを送信する側(send.php)


<?php

// 送信データ
$data = array(
"key1" => "value1",
"key2" => "value2"
);

// JSON形式に変換
$data = json_encode($data);

// ストリームコンテキストのオプションを作成
$options = array(
// HTTPコンテキストオプションをセット
'http' => array(
'method'=> 'POST',
'header'=> 'Content-type: application/json; charset=UTF-8', //JSON形式で表示
'content' => $data
)
);

// ストリームコンテキストの作成
$context = stream_context_create($options);

// POST送信
$contents = file_get_contents('http://localhost/api/reception.php', false, $context);

// reception.php のレスポンスを表示
echo $contents;

 
データを受け取る側(reception.php)


<?php

// POST の生データの読み込む
$json_string = file_get_contents('php://input');

// JSON形式で表示
echo "JSON形式:".$json_string."
"; echo "PHP変数に変換:"; // JSON エンコードされた文字列を PHP の変数に変換 $contents = json_decode($json_string); // reception.php のレスポンスを表示 print_r($contents);

 
実行結果

 

解説

json_encode()関数について

PHP形式のデータ形式をJSON形式に変換する場合は json_encode() 関数を使います。


// JSON形式に変換
$data = json_encode($data);

JSONテキストのMIMEタイプは application/json と定められています。

なので、ストリームコンテキストでヘッダー情報を以下のように設定します。


'header'=> 'Content-type: application/json; charset=UTF-8',

 

JSONデータの受信処理

JSONデータの受信処理です。file_get_contents() で送信データを受信します。JSONの場合はここがポイントになります。


$json_string = file_get_contents('php://input');

 

json_decode()関数について

PHPでは、JSONデータをそのまま扱うことができません。実践ではjson_decode()関数を利用して、JSONデータを配列に変換して処理をします。


$array_data = json_decode($json_string);

json_decode()関数の第二引数に true を設定すると連想配列になります。


// JSONを連想配列に変換
$arr = json_decode($json, true);

// 連想配列へのアクセス方法
echo $arr['res']['blogData']['id'];

json_decode()関数の第二引数に何も指定をしない場合は stdClass に変換されます。


// JSONを stdClass に変換
$arr = json_decode($json);

// stdClassのメンバへアクセス方法
echo $arr->res->blogData->id;

stdClass とは ?

プロパティやメソッドがなく、ほとんど空っぽのクラスみたいなもの。一旦インスタンスを生成すると存在しないプロパティに自由にアクセスできるようになります。

以上です。

 

-周辺知識