带有JSON内容类型的jQuery.ajax请求后发生parsererror

我正在使用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”作为dataType而不是“ jsonp”来进行ajax调用,则服务器将以空字符串作为响应。

Thomas asked 2019-11-07T22:55:03Z
9个解决方案
58 votes

JSONP要求将响应包装在某种回调函数中,因为它通过将脚本标签注入文档中来作为从另一域加载数据的机制来工作。

本质上,发生的是脚本标记被动态插入到文档中,如下所示:

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

someFn取决于您正在调用的资源,但是通常将参数设置为callback

然后使用someFn处理来自服务器的返回数据,因此服务器应以以下方式响应:

someFn({theData: 'here'});

someFn作为请求的一部分传递,因此服务器需要读取它并适当包装数据。

这些都是假设您要从另一个域中获取内容。 如果是这样,那么您将受到相同的来源政策的限制:[http://en.wikipedia.org/wiki/Same_origin_policy]

Evan Trimboli answered 2019-11-07T22:55:47Z
9 votes

升级到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/)]

Bryan answered 2019-11-07T22:56:30Z
6 votes

当您使用jsonp作为数据类型(进行跨域请求)时,jQuery生成随机函数,并将请求的URL作为名为callback(callback =?)的查询字符串附加,您需要将响应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

enter image description here

Rohit answered 2019-11-07T22:57:07Z
3 votes

有一个小错误:)您必须请求.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]

sdepold answered 2019-11-07T22:57:38Z
1 votes

您真的不应该在这里指定jsonp。 只需使用json即可,因为您只收到JSON字符串。 json(带有填充的json)需要执行javascript函数。 在这种情况下,您需要在查询字符串中指定“ callback =”。 我想这就是jQuery无法同时处理此问题的原因,其中有一个名为callback的属性。

jAndy answered 2019-11-07T22:58:02Z
1 votes

尝试使用$ .parseJSON将响应读取到对象中:

success: function(data) {
    var json = $.parseJSON(data);
}
Adam answered 2019-11-07T22:58:26Z
1 votes

确保您正在调用的服务能够以JsonP格式返回数据。

如果您使用的是ASP.NET WebAPI,则可以使用WebApiContrib.Formatting.Jsonp,它是开源的。

确保在WebApiConfig.Register中有一行如下所示。

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

我在拉扯我的头发。 希望这对某人有帮助。

William answered 2019-11-07T22:59:16Z
0 votes

并非所有服务器都支持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;
    });
}
mAsT3RpEE answered 2019-11-07T22:59:40Z
0 votes

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

像:“ [http://de.dawanda.com/api/v1/”] +资源+“ .json&c =?”

可能解决您的问题。 它为我工作。

Parveen Verma answered 2019-11-07T23:00:16Z
translate from https://stackoverflow.com:/questions/5359224/parsererror-after-jquery-ajax-request-with-jsonp-content-type