2010-12-07 6 views
5

jsonpリクエストの作成に問題はありませんが、jsonpでレスポンスを送信するためのWebサービスの設定については不明です。静的なjsonpレスポンスのテスト

まず、jsonpリクエストを許可するためにサーバーを特定の方法で構成する必要がありますか、またはページの応答が適切にフォーマットされていなければなりませんか?私のテストで

私はgeonames.orgから次のJSONP応答(私は何もしてサーバー/ドメイン1にそれを空白のページを配置した)があります。サーバー上で

<?php echo $_GET['callback'];?>({"postalcodes":[{"adminName2":"Westchester","adminCode2":"119","postalcode":"10504","adminCode1":"NY","countryCode":"US","lng":-73.700942,"placeName":"Armonk","lat":41.136002,"adminName1":"New York"}]}); 

/ドメインI「は2以下の要求を行っメートル:私は、同じサーバ(ドメイン1または2のいずれか)の上にファイルを配置し、定期的なJSONの要求にそれを回すとき

$.ajax({ 
    // works when I make the call to geonames.org instead of domain1 
    //url: 'http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?',, 
    url: 'http://www.domain1.com/test/jsonp.php?callback=?', 
    success: function(data) { 
     $('#test').html(data); 
    }, 
}); 

呼び出しが動作します。私は間違って何をしていますか?

私の質問は、リクエストを受け取ったページに関するものです。私はgeonames.org、flickr、etc ... apisにリクエストを行うとリクエストが動作することを知っています。しかし、私は応答を送るためにページを設定しようとしています。私の例では、ハードコーディングされたjsonpの空白のページしかありません。私はページ上に他のヘッダを持っていなければならないのか、私のサーバ上で何かを有効にしなければならないかどうかはわかりません。

+0

は発信者であり、サーバーは同じドメインに存在しますか? – kobe

+0

@gov、そうではありません。私の例では、3つの異なるサーバー(およびドメイン)を使用しています。 geonames.orgのデータを要求するドメイン1が動作します。 geonames.orgからの応答をドメイン2の空白のページに置き、ドメイン1からドメイン2へ同じ要求を行うことは機能しません。これを逆にしてドメイン2からドメイン1への要求と同じです。 – Choy

+0

アクセス制御ヘッダーを追加して動作させる必要がありました:header( 'Access-Control-Allow-Origin:*'); (PHPで) – Choy

答えて

12

応答が間違っています。

次のURLをお持ちの場合: http://www.mydomain.com/test/jsonp.php &コールバック=? jQueryは、URLの末尾の疑問符を一意の文字列に置き換えます。

PHP-例:あなたはこの文字列($ _GET [「コールバック」])を取り、あなたの応答関数名としてそれを使用する必要がサーバーサイドで

<?php 
$object=array('postalcodes' 
        =>array(
          array(
            "adminName2" => "Westchester", 
            "adminCode2" => "119", 
            "postalcode" => "10504", 
            "adminCode1" => "NY", 
            "countryCode" => "US", 
            "lng"   => -73.700942, 
            "placeName" => "Armonk", 
            "lat"   => 41.136002, 
            "adminName1" => "New York" 
            ))); 

    echo $_GET['callback'].'('.json_encode($object).')'; 
?> 

とどうなりますかそれを受け取ったときの応答? jQueryは一意の文字列を認識します(fx123456と仮定します)。
jQueryは、src:http://www.mydomain.com/test/jsonp.php &コールバック= fx123456<script>要素を作成します。 jQueryは、fx123456()というオンザフライ作成関数を呼び出します。この関数は、$ .ajax()のsuccess-functionのデータ引数として取られるJSON(オブジェクトとして)を返します。

したがって、jQueryによって提供されるcallback-parameterを関数内で関数名として使用しないと、jQueryは呼び出す関数の名前を認識しません(jQueryは、存在する)。

+0

ありがとう、それは多くのものを明確にします!私は$ _GET ['callback']を使い、プレーンテキストとしてjsonpを書くだけでなく、あなたのサンプルレスポンスを試しましたが、$ .ajaxコールを使ってアクセスしようとすると、空白のページで応答します。ブラウザから直接ページにアクセスすると正しく出力され、ブラウザのURLに設定したものにコールバックが変更されます。サーバーのURLをgeonameのapiに切り替えると正常に動作するので、クライアント側の呼び出しは正常です。私は変更する必要があるいくつかのホスティング/サーバー設定によって可能性がありますか? – Choy

+0

'$ .ajax()'のdataTypeオプションを 'jsonp'に設定する必要があります。代わりに$ .getJSON()を使用してください。 –

+0

私は両方を試しても空のjsonp応答を得ています。 – Choy

0

クロスブラウザのリクエストにはいつも$ .ajaxを使用していましたので、$ .ajaxを使用してjsonを呼び出す際の詳細は分かりませんが、dataTypeをjsonpに設定しようとしましたか?

また、コールバックを試しましたか?=代わりに&コールバック=?

$.ajax({ 
    url: 'http://www.mydomain.com/test/jsonp.php?callback=?', 
    dataType: 'jsonp', 
    success: function(data) { 
     $('#test').html(data); 
    }, 
}); 

最後に、私はjsonlint.comにテストJSONを実行すると、それが有効戻っていません。それは言うsyntax error, unexpected TINVALID at line 1 Parsing failed

+0

代わりに$ .getを使用し、データ型をjsonpに設定してみました。 jsonがラップされているので無効です。?(); jsonpコールバックのために。しかし、それは動作します(geonames.org apiから取得されました)。 – Choy

+0

誰でもこれを参考にしている場合は、コールバックをクエリ文字列に追加しないでください.jsonpを指定すると、jqueryがそれを行います。 – ldg

関連する問題