59

jQuery バージョン 1.5.1 を使用して、次の ajax 呼び出しを実行しています。

$.ajax({
    dataType: 'jsonp',
    data: { api_key : apiKey },
    url: "http://de.dawanda.com/api/v1/" + resource + ".json",
    success: function(data) { console.log(data); },
    error: function(jqXHR, textStatus, errorThrown) { console.log(errorThrown); console.log(textStatus); }
});

サーバーは有効な json オブジェクトで応答します。

{
  "response": {
    "type":"category",
    "entries":1,
    "params":{
      "format":"json",
      "api_key":"c9f11509529b219766a3d301d9c988ae9f6f67fb",
      "id":"406",
      "callback":"jQuery15109935275333671539_1300495251986",
      "_":"1300495252693"
    },
    "pages":1,
    "result":{
      "category":{
        "product_count":0,
        "id":406,
        "restful_path":"/categories/406",
        "parent_id":null,
        "name":"Oberteile"
       }
     }
   }
 }

ただし、成功のコールバックは呼び出されず、代わりにエラーのコールバックが次の出力を生成します。

jQuery15109935275333671539_1300495251986 was not called
parsererror

なぜこれが起こるのですか?

jQuery に追加のライブラリを使用していません。

編集:

「jsonp」ではなく「json」を dataType として使用して ajax 呼び出しを実行しようとすると、サーバーは空の文字列で応答します。

4

9 に答える 9

60

JSONPは、別のドメインからデータをロードするメカニズムとしてスクリプトタグをドキュメントに挿入することで機能するため、応答を何らかのコールバック関数でラップする必要があります。

基本的に、スクリプトタグは次のようにドキュメントに動的に挿入されます。

<script src="http://the.other.server.com/foo?callback=someFn"></script>

callback呼び出しているリソースに依存しますが、パラメータは一般的callbackです。

someFn次に、サーバーから返されたデータを処理するために使用されるため、サーバーは次のように応答する必要があります。

someFn({theData: 'here'});

someFnはリクエストの一部として渡されるため、サーバーはそれを読み取り、データを適切にラップする必要があります。

これはすべて、別のドメインからコンテンツを取得していることを前提としています。その場合、同じオリジンポリシーによって制限されます:http://en.wikipedia.org/wiki/Same_origin_policy

于 2011-03-19T00:52:16.107 に答える
10

Jquery 1.5にアップグレードし、ドメイン間で電話をかけようとした後、同じ問題が発生しました。最終的に、$。getJSONが機能することがわかりました。具体的には、

$.getJSON(url,
    function(data){
        yourFunction(data);
       return false;
    });

私が使用したURLは次のとおりです。

var url = WEB_SERVER_URL;
url = url + "&a=" + lat;
url = url + "&b=" + lng; ....
url = url + "&jsoncallback=?";

別のサーバーで実行されているサーバーで、このコードを制御できるようになりました。

PrintWriter writer = response.getWriter();
String jsonString = json.toString(JSON_SPACING);
String callback = request.getParameter("jsoncallback");
// if callback in URL and is not just the "?" (e.g. from localhost)
if (callback != null && callback.length() > 1)
{
    writer.write(callback + "(" + jsonString + ");");
}
else
{
    writer.write(jsonString);
}

(jsonオブジェクトはJSONObjectのインスタンスであり、コードはここhttp://www.json.org/java/にあります)

于 2011-04-26T04:25:04.477 に答える
6

jsonp をデータ型として使用している (クロス ドメイン リクエストを作成している) Jquery がランダム関数を生成し、コールバック (callback=?) という名前のクエリ文字列として要求された URL に追加する場合、以下に示すように、この関数のパラメーターとして応答 json データを追加する必要があります。 -

url : http://www.dotnetbull.com/cross-domain-call.ashx?ref=jquery-jsonp-request
url call by ajax :
http://www.dotnetbull.com/cross-domain-call.ashx?ref=jquery-jsonp-request&callback=jQuery1510993527567155793_137593181353

応答データは次のようになります。

 string callback = context.Request.QueryString["callback"];

 if (!string.IsNullOrEmpty(callback))
   context.Response.Write(string.Format("{0}({1});", callback, jc.Serialize(outputData)));
else
   context.Response.Write(jc.Serialize(outputData));

詳細については、こちらをご覧ください: jsonp コンテンツ タイプを使用した jquery.ajax リクエスト後のパーサー エラー

ここに画像の説明を入力

于 2013-08-05T18:44:34.863 に答える
3

ちょっとした間違いがあります :) .json ではなく .js をリクエストする必要があります。

$.ajax({
    dataType: 'jsonp',
    data: { api_key : apiKey },
    url: "http://de.dawanda.com/api/v1/" + resource + ".js",
    success: function(data) { console.log(data); },
    error: function(jqXHR, textStatus, errorThrown) { console.log(errorThrown); console.log(textStatus); }
});

ああ、あなたは api のクライアントがあることに気付きましたか? https://github.com/dawanda/dawanda-api-client-js

于 2011-03-21T08:14:45.917 に答える
1

ここでjsonpを指定するべきではありません。JSON文字列を受け取っているだけなので、jsonを使用してください。json(パディング付きのjson)は、javascript関数が実行されることを想定しています。その場合、クエリ文字列内に「callback=」を指定する必要があります。それがjQueryがこれも処理できない理由だと思います。コールバックという名前のプロパティがあります。

于 2011-03-19T00:55:17.277 に答える
1

$ .parseJSONを使用して、応答をオブジェクトに読み込んでみてください。

success: function(data) {
    var json = $.parseJSON(data);
}
于 2011-03-19T01:00:27.550 に答える
1

呼び出しているサービスに、JsonP 形式でデータを返す機能があることを確認してください。

asp.net webapi を使用している場合は、オープン ソースの WebApiContrib.Formatting.Jsonp を使用できます。

WebApiConfig.Register に以下のような行があることを確認してください。

config.Formatters.Insert(0, new JsonpMediaTypeFormatter(new JsonMediaTypeFormatter(), "callback"));

私はこれで髪を引っ張っていました。これが誰かに役立つことを願っています。

于 2014-06-05T16:00:01.253 に答える
0

パラメータ「callback =?」を追加しないまで、同じ問題が発生していました。または「c=?」URLで。

のように: " http://de.dawanda.com/api/v1/ " + リソース + ".json&c=?"

あなたの問題を解決するかもしれません。それは私のために働いた。

于 2016-05-21T12:47:06.313 に答える