0

簡単なhtmlファイルがあります。url1にアクセスし、json応答を正常に解析します。

クライアント->URL1->クライアントへの応答

HTMLでコードを変更し、URL2を呼び出しました

クライアント->URL2->URL1->URL2への応答->クライアントへの応答

url1にコメントを付け、url2を呼び出しました。url2は、url1を呼び出して応答を取得する単純なサーブレットです。サーブレットは同じ応答をクライアントに返しますが、今回はajax/jqueryが解析エラーを返します。警告(request.responseText)すると、URL1によって返される応答と完全に一致します。

$.ajax({   
//url: "http://abc1.com", // Line 1  
  url: "http://abc2.com", // Line 2   
  data: {param1, param2},    
  dataType: "jsonp",            
  type: "GET",  
      async:false,  
    success: function(parsed_json) {  
            alert("Success");           
        },
        error: function (request, status, error) {  
            alert("Error" + error);
            alert(request.responseText);
        }

サーブレットは、入力ストリームのコンテンツを出力ストリームにコピーするための単なるレイヤーです。

InputStream input = new URL(url).openStream();
resp.setContentType("application/json"); // Apache commons IOUtils to copy IOUtils.copy(input, resp.getOutputStream());
resp.getOutputStream().flush();

json-string-responseを手動で確認しましたが、同じように見えます。何が問題なのか?

4

2 に答える 2

1

考えられる問題の1つは次のとおりです。これdataTypejsonp、とは異なりjsonます。jQueryは、JSON-Pを予期していたときにリクエストがJSONとして戻ってきた場合、エラーをスローする可能性があります。を変更して何かdataTypejson変更しますか?

ちなみに、違いは次のとおりです。

JSON-Pは、主にリモートWebサイトとの通信に使用されます。ブラウザはセキュリティ上の理由から他のドメインにAJAXリクエストを送信できないため、JSON-Pの「AJAXリクエスト」は実際には次のようなものをDOMに追加します。

<script src="http://www.otherwebsite.com/info.js?callback=myCallback"></script>

リモートサイトがJSON-Pをサポートしている場合、次のようなものが返されます。

myCallback({"foo": "bar"})

次にmyCallback、リモートサイトからのデータを使用して関数が呼び出されます-ta da!

jQueryは、と言うと、このすべてのコールバックビジネスを自動的に処理しますdataTypeが、コールバックでデータをラップしないjsonpと言うと、(私が理解しているように)jQueryは、スクリプトがロードされたことを認識し、コールバックが起動されなかったため、エラーをスローします。jsonp

あるいは、JSON-Pで、息を切らしているだけかもしれません。ともかく。念のため :)

于 2012-07-22T03:21:12.560 に答える
0

これについてjqueryのドキュメントを調べたところ、「クロスドメインリクエストとdataType:「jsonp」リクエストは同期操作をサポートしていない」ようです。したがって、に変更するとasync:true、さらに運が良くなる可能性があります。:)

于 2012-07-22T03:29:10.397 に答える