TECH I.S.

JSONP


JSONPは、クロスドメインの問題を気にせずにJSONデータを送信する方法です。

JSONPはXMLHttpRequestオブジェクトを使用しません。

JSONPでは<script>代わりにタグが使用されます。


JSONPの概要

JSONPは、JSON with Paddingの略です。

クロスドメインポリシーにより、別のドメインからファイルを要求すると、問題が発生する可能性があります。

別のドメインから外部スクリプトをリクエストする場合には、この問題は発生しません。

JSONPはこの利点を利用し、XMLHttpRequestオブジェクトの代わりにscriptタグを使用してファイルを要求します。

<script src="demo_jsonp.php">

サーバーファイル

サーバー上のファイルは、結果を関数呼び出し内にラップします。

<?php $myJSON = '{ "name":"John", "age":30, "city":"New York" }'; echo "myFunc(".$myJSON.");"; ?>

結果は、JSONデータをパラメーターとして使用した「myFunc」という名前の関数への呼び出しを返します。

関数がクライアントに存在することを確認してください。

JavaScript関数

「myFunc」という名前の関数がクライアントにあり、JSONデータを処理する準備ができています。

function myFunc(myObj) {   document.getElementById("demo").innerHTML = myObj.name; }


動的スクリプトタグの作成

上記の例では、スクリプトタグを配置した場所に基づいて、ページの読み込み時に"myFunc"関数が実行されますが、これはあまり満足のいくものではありません。

scriptタグは、必要な場合にのみ作成する必要があります。

ボタンがクリックされたときに<script>タグを作成して挿入します。

function clickButton() {   let s = document.createElement("script");   s.src = "demo_jsonp.php";   document.body.appendChild(s); }


動的JSONP結果

上記の例はまだ非常に静的です。

JSONをphpファイルに送信して例を動的にし、phpファイルが取得した情報に基づいて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_encode()関数を使用して配列をJSONに変換します。
  • 戻りオブジェクトを「myFunc()」で囲みます。

JavaScriptの例

「myFunc」関数は、phpファイルから呼び出されます。

const obj = { table: "products", limit: 10 }; let s = document.createElement("script"); s.src = "jsonp_demo_db.php?x=" + JSON.stringify(obj); document.body.appendChild(s); function myFunc(myObj) {   let txt = "";   for (let x in myObj) {     txt += myObj[x].name + "<br>";   }   document.getElementById("demo").innerHTML = txt; }


コールバック関数

サーバーファイルを制御できない場合、サーバーファイルに正しい関数を呼び出すにはどうすればよいでしょうか。

場合によっては、サーバーファイルがパラメーターとしてコールバック関数を提供します。

PHPファイルは、コールバックパラメータとして渡した関数を呼び出します。

let s = document.createElement("script"); s.src = "jsonp_demo_db.php?callback=<strong>myDisplayFunction</strong>"; document.body.appendChild(s);



プログラミング学習を加速させる

プログラミングをプロの講師に教えてもらいませんか。

テックアイエスのプログラミングスクールは初心者も大歓迎です。年齢制限もありません。転職・副業に強く、挫折させない手厚いサポートで稼ぐ力を身につけましょう!

スクールの詳細