前回、作成した(実は、本を参照させていただいただけ)下記プログラム (json.php) ですが、これをそのままWebサーバ上で実行すると、
<?php # jQueryなど主要なJavaScriptライブラリを通じてのアクセスである # (ブラウザからの直接アクセスでない)ことを確認します。 # この方法はJSONハイジャック攻撃など☆レシピ305☆(JSONのセキュリティについて知りたい)に対しても有効です。 if (! isset($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') { die(json_encode(array('status' => "不正な呼び出しです"))); } # データを準備します。 $value = array( 1 => array('item' => '台湾ラーメン', 'price' => 580, 'orders' => 113), 2 => array('item' => '台湾ラーメン(アメリカン)', 'price' => 580, 'orders' => 72), 3 => array('item' => 'ニンニクチャーハン', 'price' => 630, 'orders' => 87), ); # Content-Typeを「application/json」に設定します。 header("Content-Type: application/json; charset=UTF-8"); # Internet ExplorerがContent-Typeヘッダーを無視しないようにします☆レシピ287☆(XSS対策をしたい)。 header("X-Content-Type-Options: nosniff"); # 可能な限りのエスケープを行ない、JSON形式で結果を返します。 echo json_encode( $value, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP ); /* ?>終了タグ省略 ☆レシピ001☆(サーバーのPHP情報を知りたい) */
下記の表示がされます。
{"status":"\u4e0d\u6b63\u306a\u547c\u3073\u51fa\u3057\u3067\u3059"}
なんじゃこりゃ? ということでプログラムを少し修正します。
↓ これですね。
<?php echo '<!DOCTYPE HTML>'; echo '<html lang="ja">'; echo '<head>'; echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'; echo '</head>'; echo '<body>'; # jQueryなど主要なJavaScriptライブラリを通じてのアクセスである # (ブラウザからの直接アクセスでない)ことを確認します。 # この方法はJSONハイジャック攻撃など☆レシピ305☆(JSONのセキュリティについて知りたい)に対しても有効です。 if (! isset($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') { die(json_encode(array('status' => "不正な呼び出しです"), JSON_UNESCAPED_UNICODE)); }
日本語表示を行い、 die() に、JSON_UNESCAPED_UNICODE パラメータを付加しました。すると結果は、
{"status":"不正な呼び出しです"}
となります。要するに、XMLHttpRequest コール (ブラウザが実装している javascript の HTTP通信機能API) でないためエラーとなります。このプログラムが直接JSONデータを吐き出す仕様になっているために、そのままサーバにアクセスしてもエラーとなるようになっているのです。
それでは、どのようにアクセスすればよいのでしょうか?