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 使用其他库。

编辑:

如果我尝试使用“json”作为数据类型而不是“jsonp”进行 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;
    });

我使用的网址是这样的:

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 生成随机函数并将请求的 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 请求后的 parsererror

在此处输入图像描述

于 2013-08-05T18:44:34.863 回答
3

有一个小错误:) 你必须请求 .js 而不是 .json。

$.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函数执行。在这种情况下,您需要在查询字符串中指定“回调 =”。我想那是。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

并非所有服务器都支持 jsonp。它要求服务器在其结果中设置回调函数。我使用它从返回纯 json 但不支持 jsonp 的站点获取 json 响应(但将来可能):

function AjaxFeed(){

    return $.ajax({
        url:            'http://somesite.com/somejsonfile.php',
        data:           {something: true},
        dataType:       'jsonp',

        /* Very important */
        contentType:    'application/json',
    });
}

function GetData()
    AjaxFeed()

    /* Everything worked okay. Hooray */
    .done(function(data){
        return data;
    })

    /* Okay jQuery is stupid manually fix things */
    .fail(function(jqXHR) {

        /* Build HTML and update */
        var data = jQuery.parseJSON(jqXHR.responseText);

        return data;
    });
}
于 2013-10-19T14:03:32.987 回答
0

在我没有附加参数“callback=?”之前,我遇到了同样的问题 或“c=?” 在网址中。

喜欢:“ http://de.dawanda.com/api/v1/ ”+资源+“.json&c=?”

可以解决你的问题。它对我有用。

于 2016-05-21T12:47:06.313 回答