JSONP
- 前のページ JSON HTML
- 次のページ jQuery セレクタ
JSONPは、クロスドメイン問題を考慮せずにJSONデータを送信する方法です。
JSONPはXMLHttpRequestオブジェクトを使用しません。
JSONPの使用方法 <script>
タグが代わりに使用されます。
JSONPの概要
JSONPとは、JSON with Paddingのことです。
異なるドメインからのファイルのリクエストは、クロスドメインポリシーにより問題が発生します。
異なるドメインからの外部スクリプトはこの問題がありません。
JSONPはこの利点を利用し、scriptタグを使用してXMLHttpRequestオブジェクトを置き換えています。
<script src="demo_jsonp.php">
Server ファイル
サーバー上のファイルは、関数呼び出しで結果を包装しています:
インスタンス
<?php $myJSON = '{ "name":"Bill Gates", "age":62, "city":"Seattle" }'; echo "myFunc(".$myJSON.");"; ?>
結果は、JSON データが引数として渡される "myFunc" 名の関数の呼び出しとして返されます。
クライアント側にこの関数が存在することを確認してください。
JavaScriptの関数
クライアント側に位置する "myFunc" ファンクションを使用して JSON データを処理します:
インスタンス
function myFunc(myObj) { document.getElementById("demo").innerHTML = myObj.name; }
動的なスクリプトタグを作成します
上記の例はページが読み込まれたときに "myFunc" ファンクションを実行し、スクリプトタグの場所に応じて不十分です。
スクリプトは必要なときにのみ作成されるべきです:
インスタンス
ボタンがクリックされたときに <script> タグを作成および挿入します:
function clickButton() { var s = document.createElement("script"); s.src = "demo_jsonp.php"; document.body.appendChild(s); }
動的な JSONP 結果
上記の例は静的なものです。
PHP ファイルに JSON を送信することで動的な例を作成し、その情報に基づいて JSON オブジェクトを返すことができます。
PHP ファイル
<?php header("Content-Type: application/json; charset=UTF-8"); $obj = json_decode($_GET["x"], false); $conn = new mysqli("myServer", "myUser", "myPassword", "Northwind"); $result = $conn->query("SELECT name FROM ".$obj->$table." LIMIT ".$obj->$limit); $outp = array(); $outp = $result->fetch_all(MYSQLI_ASSOC); echo "myFunc(".json_encode($outp).")"; ?>
PHP 文件解释:
- 把请求转换为对象,使用 PHP 函数
json_decode()
。 - 访问数据库,并用被请求的数据填充数组。
- 向对象添加数组。
- 使用
json_decode()
函数把该数组转换为 JSON。 - 用 "myFunc()" 封装返回对象。
JavaScript インスタンス
将从 php 文件调用 "myFunc" 函数:
function clickButton() { var obj, s obj = { "table":"products", "limit":10 }; s = document.createElement("script"); s.src = "jsonp_demo_db.php?x=" + JSON.stringify(obj); document.body.appendChild(s); } function myFunc(myObj) { var x, txt = ""; for (x in myObj) { txt += myObj[x].name + "<br>"; } document.getElementById("demo").innerHTML = txt; }
コールバック関数
サーバーファイルを制御できない場合、どうやってサーバーファイルが正しい関数を呼び出すかをどうしますか?
時にはサーバーファイルがコールバック関数をパラメータとして提供します:
インスタンス
PHP ファイルは、コールバックパラメータとして渡された関数を呼び出します:
function clickButton() { var s = document.createElement("script"); s.src = "jsonp_demo_db.php?callback=myDisplayFunction"; document.body.appendChild(s); }
- 前のページ JSON HTML
- 次のページ jQuery セレクタ