PHPでJSONを送受信する

WebAPIを叩くときなど、 key1=value1&key2=value2 のようなデータではなくて、JSONをやりとりすることが多いのに、なぜかよく忘れるのでメモ。

cURLを使っても良いんだけどサーバによってはcURLが使えない事もあるので、今回は file_get_contents を使ってみました。
ちなみに、よく忘れるポイントはContent-type。なぜか、 "Content-type: application/json\r\n" をよく忘れます。

<?php
$url = 'https://foo.nautilus-code.jp/api/hogehoge.json'; // APIのURL
$data = array('key' => $_POST['value']); // フォーム等から受信したデータを連想配列でセットします。
$options = array('http' => array(
  'method' => 'POST',
  'header' => "Content-type: application/json\r\n",
  'content' => json_encode($data) // 連想配列をJSONに変換
));
$options = stream_context_create($options);
$contents = file_get_contents($url, false, $options); // APIサーバにデータ送信
header('Content-type: application/json'); //APIサーバからの戻り値をこのPHPの呼び出し元に返却。JSONを受信することを想定しているので、そのまま戻す。
echo $contents;
?>

これでOK。

でも、どうして中継するだけの機能が必要なの?JavaScriptで直接見にいけば良いじゃん、と思うかも知れませんが、
クロスドメインの状況で他サーバのAPIをAjaxで呼び出せない(ブラウザの制約)なので、こんな実装が必要になることがたまにあります…