使用jsonp内容类型的jQuery.ajax请求后的parsererror

时间:2011-03-19 00:47:46

标签: jquery jsonp jquery-1.5 parse-error

我使用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调用,则服务器以空字符串进行响应。

9 个答案:

答案 0 :(得分:57)

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

答案 1 :(得分:9)

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

答案 2 :(得分:6)

当你使用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));

详细了解: parsererror after jquery.ajax request with jsonp content type

enter image description here

答案 3 :(得分: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

答案 4 :(得分:1)

你真的不应该在这里指定 jsonp 。只需使用 json ,因为您只是收到一个JSON字符串。 json (json with padding)期望执行javascript函数。在这种情况下,您需要在查询字符串中指定“callback =”。我想这就是jQuery无法处理的原因,还有一个名为callback的属性。

答案 5 :(得分:1)

尝试使用$ .parseJSON:

将响应读入对象
success: function(data) {
    var json = $.parseJSON(data);
}

答案 6 :(得分:1)

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

如果您使用的是asp.net webapi,则可以使用WebApiContrib.Formatting.Jsonp,它是开源的。

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

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

我把头发拉过来。希望这有助于某人。

答案 7 :(得分: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;
    });
}

答案 8 :(得分:0)

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

赞:“http://de.dawanda.com/api/v1/”+ resource +“。json&amp; c =?”

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