Data API を PHP の file_get_contents で取得するときに注意した方がいいかもしれないこと

Movable Type 6 で注目されている Data API を PHP で扱うときの Tips というか、ハマったところが解決したのでシェアします。

まず、インデックステンプレートにシンプルな PHP ファイルを作り、file_get_contents を利用して Data API で JSON を取得して表示してみます。

<?php
$url = '<mt:CGIPath><mt:Var name= "config.DataAPIScript">/v1/sites/<mt:BlogID>/entries';
echo file_get_contents($url);
?>

問題なく表示されますね。

file_get_contents01

次に、リクエスト URL に「?status=Draft」を付けてみます。このパラメータを付けると、下書き状態の記事を取得することになるので認証を通さないと取得できません。

試しにブラウザで URL を直接叩くと、以下のような JSON が返ってきます。

{
"error":{
"code":403,
"message":"Do not have permission to retrieve the requested entries."
}
}

では、先程の PHP の $url にもこのパラメータを付けてみます。

<?php
$url = '<mt:CGIPath><mt:Var name= "config.DataAPIScript">/v1/sites/<mt:BlogID>/entries?status=Draft';
echo file_get_contents($url);
?>

ページにアクセスしてみると、、、真っ白です。

PHP エラーを表示するようにファイルの先頭に「ini_set('display_errors', 1);」を入れて見ると、次のようなエラーが出ます。

Warning: file_get_contents(http://your-host/mt-data-api.cgi/v1/sites/15/entries?status=Draft): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/your-path/file_get_contents.php on line 11

さてどうしたものかとここでハマり、とりあえずは代替案で対応していましたが、以下のページを参考に解決しました。

このサイトの説明にあるように、file_get_contents の第三引数に渡すコンテキストリソースを作成して渡してみます。

<?php
ini_set('display_errors', 1);
$url = '<mt:CGIPath><mt:Var name= "config.DataAPIScript">/v1/sites/<mt:BlogID>/entries?status=Draft';
$context = stream_context_create(array(
'http' => array('ignore_errors' => true)
));
echo file_get_contents($url, false, $context);
?>

無事、この PHP ファイルを通してでもブラウザでアクセスしたときと同様の JSON が表示されました。良かった良かった。

file_get_contents02

なお、この部分の file_get_contents では PHP の Warning とかのエラーを出さないようにするのは、file_get_contents の頭に「@」を付けて「@file_get_contents」にすれば、Warning とかの PHP エラーは出なくなります。

以上です。

上記のページが分かりやすいよと教えてくださった宮澤さん、同じように原因をアドバイスしてくださった松崎さん、ありがとうございます!

  • このエントリーをはてなブックマークに追加
Just a second...