我正在使用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调用,则服务器将以空字符串作为响应。
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
升级到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/)
当您使用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
有一个小错误:)您必须请求.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即可,因为您只是收到JSON字符串。json(带填充的json)需要执行javascript函数。在这种情况下,您需要在查询字符串中指定“ 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。它要求服务器在其结果中设置回调函数。我用它来从返回纯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 =?” 在网址中。
就像:“ http://de.dawanda.com/api/v1/ ” +资源+“ .json&c =?”
可能解决您的问题。它为我工作。
文章标签:jquery , jquery-1.5 , jsonp , parse-error
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
评论已关闭!