2012-03-01 2 views
12

誰かがJSONPを使用してそのサーバーからデータを取得できるようにするには、サーバー側で何が必要ですか。また、ユーザー側で何をする必要がありますか? XMLHttpRequestの代わりにJSONPを使用したいと思います。JSONPを設定するにはどうすればよいですか?

同じ発信元ポリシーのため、Firefox拡張機能からは機能しません。だから、人々はJSONを推薦しましたが、チュートリアルやインターネット上のガイドを検索した後にはかなり失われています。

ありがとうございました!サーバー側では

答えて

12

サーバがPHPを実行していると仮定すると、 'コールバック' GETリクエストを追加するだけで済みます。

<?php header('content-type: application/json; charset=utf-8'); 
$data = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); 
echo $_GET['callback'] . '('.json_encode($data).')'; 

と(jQueryのを使用して)クライアント側で:

$.ajax({url: 'http://site.com/data.php', dataType:'jsonp'}); 

上記のPHPコードだけでデモのために、sanitise $ _GET [ 'コールバック']

それを忘れないようにされてあなたの問題が同じ発信元ポリシーの場合は、サーバー側からallow cross-originにするだけで、すべてがうまくいくはずです。

+0

ありがとうございます! CORSの解決策は私を固定しました。 –

+0

ちょうどdownvoted BCこの答えはPHPを前提としているので、私はT.J.を好む。以下のCrowderの答え。 – Steven2163712

+0

@ Steven2163712タイトルを超えて読むと、OPの問題は言語に関係なく実際にはCORSです。 TJの答えはより一般的ですが(IMO phpは十分に一般的です)、OP問題を解決することはできません。 – soemarko

7

、あなたが設定する必要があり、すべてがGET要求を受け入れ、あるJSON-Pの規則を使用して、データを返すWebリソース(例えば、ページ)です:

callback({"data": "here"}); 

...関数名(この例では「コールバック」)は通常、クエリ文字列パラメータの1つ(通常はパラメータ「コールバック」)から取得され、データはJSONテキストです(技術的にはJavaScriptオブジェクトでは有効ですが、JSON-Pでの規約はJSONで有効なものに制限することです)。例えばそれでは、要求はこのように見えたとしましょう:

ということを言って、ページ foo.php任意のダイナミックサーバ側のシステムであってもよい、PHPである必要はありません)を呼び出し
http://example.com/foo.php?callback=bar

私たちが呼びたい関数は "bar"です。私たちの応答は次のようになります。

クライアント側で
bar({"data": "here"}); 

、あなたが動的ページにscript要素を追加し、また、JSON-Pの応答によってトリガーされますコールバック関数を追加する必要があります。通常、その関数にいくつかのランダムな名前を付けて、終了したら削除します。

Here's a complete exampleここでスタックオーバーフローに関する別の質問への回答として。 Firefoxのアドオンで使用するには少し修正する必要がありますが、そのコンセプトは同じです。

1

jsonpはラッパーを持つjsonです。したがって、新しい<script>タグを動的に挿入して、他のサーバーを指すsrcを使用して、別のサーバーにajaxリクエストを偽装できます。ラッパーは基本的に、jsonpの返すものを、標準のjsonデータを抽出するために実行できる有効なjavascript関数呼び出しにします。

unwrap_json("{'this':'is','sparta':'!'}"); 

注:リモートサーバーには、次のリテラル文字列を返します

function unwrap_jsonp(data) { 
    eval(data); 
} 

一般的に、ただデモする「安全でないバージョンでは、あなたはこのような何かを持っていると思いますこれは実行され埋め込まれたJSON文字列をネイティブのjavascriptデータ構造に戻すリバースのJavascriptプレーンテキストコードです。

ほとんどのJSONPサービスでは、クエリ文字列を使用して余分なパラメータを指定して、レスポンスをラップするハンドラ関数に名前を付けることができます。

http://example.com/getjsonp.php?callback=unwrap_json 
関連する問題