使用jsonp内容types的jQuery.ajax请求之后的parseError

我正在使用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" } } } } 

但成功的callback从来没有被调用,而是错误callback产生这个输出:

 jQuery15109935275333671539_1300495251986 was not called parsererror 

为什么会发生?

我没有使用jQuery的附加库。

编辑:

如果我尝试使用“json”作为dataType而不是“jsonp”进行ajax调用,则服务器用空string进行响应。

JSONP要求响应被封装在某种callback函数中。

所以服务器应该回应:

 someFn({....}); 

someFn作为请求的一部分被传递,所以服务器需要读取并适当地包装数据。

这一切都假设你从另一个领域抓取内容。 如果是这样,你受到相同的来源政策的限制: http : //en.wikipedia.org/wiki/Same_origin_policy

升级到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 "?" (eg from localhost) if (callback != null && callback.length() > 1) { writer.write(callback + "(" + jsonString + ");"); } else { writer.write(jsonString); } 

(json对象是JSONObject的一个实例,代码可以在这里findhttp://www.json.org/java/ )

当你使用jsonp作为数据types(使跨域请求)jquery生成随机函数和追加是请求的url作为名为callback(callback =?)的查询string,您需要追加响应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内容types的jquery.ajax请求之后的parsererror

在这里输入图像描述

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

你真的不应该在这里指定jsonp 。 只需使用json,因为你只是收到一个JSONstring。 JSON (填充JSON)期望执行一个JavaScript函数。 在这种情况下,你需要在查询string中指定一个“callback =”。 我想这就是为什么jQuery不能处理这个,也有一个名称callback属性。

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

 success: function(data) { var json = $.parseJSON(data); } 

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

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

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

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

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

并不是所有的服务器都支持jsonp。 它要求服务器在其结果中设置callback函数。 我用这个来从返回纯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; }); } 

我得到同样的问题,直到我没有附加参数“callback=?” 或“c =?” 在url。

像:“ http://de.dawanda.com/api/v1/ ”+ resource +“.json&c =?”

可以解决你的问题。 它为我工作。

感谢Evan Trimboli。

只有我所做的更改才被添加

JSONcallback= someFun

并从中更改匿名函数名称

function(DL)

functionsomeFun(dl)

完整的代码行如下:

 getJSON("http://localhost/phk/districtList.json?json-callback=someFun", function someFun(dl){ .... .... }