5

次のコードを使用して JSONP 応答を取得しようとしています...

$http.jsonp('http://example.com:8888/?callback=JSON_CALLBACK').success( function( response )
{
    console.dir( response );
});

http://example.com:8888/?callback=JSON_CALLBACKは、node.js 経由で以下を返します

JSON_CALLBACK({ date:'2013-05-15T08:53:51.747Z' });

こんな感じでnode.jsにヘッダーが設定されているのですが……。

res.writeHead(200, {'Content-Type': 'application/json'});

それでも、Chrome コンソールに表示されるエラーはこれです...

Uncaught ReferenceError: JSON_CALLBACK is not defined 

しかし、奇妙なことに、関数を作成するwindow.JSON_CALLBACK(response)と実行されます。でも、成功とは自分に代わってそれを行うことだと思っていました。

4

4 に答える 4

2

content-type ヘッダーが正しくありません。

application/json返されるものがプレーンな JSON である場合に使用します。JSONP は Javascript であるため、使用する必要があります。application/javascript

于 2013-05-15T09:18:25.707 に答える
0

私はこのハックを見つけました、そしてそれは私にとってはうまくいきます

    //.................................ini: ハッ​​ク
    /*
        $http リクエストの直前にこのコードをコピーして貼り付けます。
    */      
        var c = $window.angular.callbacks.counter.toString(36);

        $window['angularcallbacks_' + c] = 関数 (データ) {
            $window.angular.callbacks['_' + c](データ);
            $window['angularcallbacks_' + c]; を削除します。
        };     
    //......................................end: ハック

    //あなたの $http リクエスト
    $http.jsonp(URL)
     .success(関数(){
        console.log("OK")
    }))
     .error(関数(データ、ステータス、ヘッダー、構成){
        console.error("コ");
    });  
于 2014-01-27T17:02:51.253 に答える
0

jsonp が機能していない angular $resource を参照 してください

于 2013-08-20T10:21:58.067 に答える
0

これが迅速で汚い解決策です。を出力する代わりに、出力JSON_CALLBACK({ date:'2013-05-15T08:53:51.747Z' })を試すことができますangular.callbacks._0({ date:'2013-05-15T08:53:51.747Z' })。これはAngularのバグだと思います。

別の方法として、次の方法で URL をリクエストすることもできます。

$http({
  method: 'JSONP',
  url: 'https://something.com/' + '?callback=JSON_CALLBACK' + '&otherstuffs'
});

PS。php バックエンドを使用している場合、php ファイルの名前を変更すると良い結果が得られる場合があることに気付きました (index.php を使用する代わりに api.php を試すことができるなど)。それは完全にランダムに見えますが(どの名前が機能し、その逆も同様です)-これは、AngularがjsonのURLを読み取る方法に関係していると思います。

この残念なバグの理由は、Angular がJSON_CALLBACKtoを置き換えるためのようangular.callbacks._0ですが、URL インタープリターが原因で失敗することがあります。

さらに、成功した場合でも、使用しているサーバーが?callback=angular.callbacks._0URL の をサポートしていない可能性があります (これはサーバー間で一般的な動作です)。

于 2015-03-06T21:42:46.793 に答える