使用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){ .... .... }