この記事の例では、PHP での Ajax クロスドメインの jsonp ソリューションについて説明します。参考のために皆さんと共有してください。詳細は次のとおりです。
まず、json と jsonp の違いについて説明しましょう。
Json は、テキストベースのデータ交換方法、またはデータを記述するための形式です。
関連する学習の推奨事項: php プログラミング (ビデオ)
var person = { "name": "test", "age": "25", "sex": "男" }; var data = [1, 2, 3, 4, 5];
また、jsonp は非公式のクロスドメイン データ対話プロトコルであり、ユーザーがコールバック パラメーターをサーバーに送信すると、サーバーがデータを返すときに、このコールバック パラメーターを関数名として使用して JSON データをラップし、クライアントが独自の関数をカスタマイズして返されたデータを自動的に処理できるようにします。
たとえば、a.com の Web サイトで b.com の b.js を参照しましたが、そのようなクロスドメイン参照はエラーを引き起こしません。つまり、js ファイルを呼び出すときに、クロスドメインの影響を受けません。
<script type="text/javascript" src="http://www.b.com/b.js"></script>
次に、b.js に次のコードを追加して、実行できるかどうかを確認します。
alert("I from b");
実行できることを確認します。
では、a.com で js 関数を作成し、それを b.com の b.js で呼び出すことは可能でしょうか?
a.com 下のindex.html は次のとおりです。
b.com 下の b.js は次のとおりです。
a("from b");
上記も実行できます。を見ると、b.js のデータが実際に関数 a に正しく渡されていることがわかります。
問題が再び発生します。a.com で作成された関数名は、b.js で呼び出される関数名と一致している必要があります。では、b.com サーバーにこの関数名を知らせるにはどうすればよいでしょうか?渡される場合は、渡す関数名に callback= を追加します。もちろん、コールバックの名前は変更できますが、誰もがこのように名前を付けるので、これは慣例です。
a.com のindex.html は次のとおりです。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script type="text/javascript"> function a(data) { alert("uid :" + data.uid + "name :" + data.name); } </script> <!-- 注意这里把b.js改成b.php了 --> <script type="text/javascript" src="http://www.b.com/b.php?callback=a"></script> </body> </html>
b.com の b.php は次のとおりです。
<?php $callback = !empty($_GET['callback']) ? trim($_GET['callback']) : ''; if(!empty($callback)) { $data = json_encode(array( 'uid' => 1, 'name' => '测试', )); echo "{$callback}({$data});"; }
上記も実行できます。コールバック関数名がわかっていると、b.com サーバーはデータを処理し、文字列連結を通じて出力します。
jquery はすでに jsonp のサポートを提供しています。a.com のindex.html は次のとおりです:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <p class="info"></p> <script type="text/javascript" src="http://www.b.com/jquery.js"></script> <script type="text/javascript"> $.ajax({ dataType: "jsonp", url: "http://www.b.com/b.php", jsonp: "callback", success: function(data) { $(".info").text("uid:" + data.uid + " name:" + data.name); } }); </script> </body> </html>
クロスドメイン ポリシー制限テーブルは次のとおりです:
説明 | 通信を許可 | |
http://www.a.com/b.js | 同じドメイン名の下で許可 | |
http://www.a.com/script/b.js | 同じドメイン名の異なるフォルダーAllow | |
http://www.a.com/b.js | 同じドメイン名、異なるポート許可されません | |
https://www.a.com/b.js | 同じドメイン名、異なるプロトコル許可されません | |
http://127.0.0.100/b.js | ドメイン名とドメイン名に対応する IP アドレスは使用できません | |
メイン ドメインは同じですが、サブドメインは異なります |
許可されません | #http ://www.a.com/a.js |
同じドメイン名、異なる第 2 レベル ドメイン名 (上記と同じ) | 許可されません# #http://www.a.com/a.js | http://www.b.com/b.js|
許可されません |
以上がPHP での Ajax クロスドメイン ソリューションの jsonp 例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。