首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有jsonp内容类型的jQuery.ajax请求后出现解析器错误

具有jsonp内容类型的jQuery.ajax请求后出现解析器错误
EN

Stack Overflow用户
提问于 2011-03-19 08:47:46
回答 9查看 93.1K关注 0票数 59

我正在使用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调用,服务器会返回一个空字符串。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-03-19 08:52:16

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

票数 60
EN

Stack Overflow用户

发布于 2011-04-26 12:25:04

在升级到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 "?" (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/中找到)

票数 10
EN

Stack Overflow用户

发布于 2013-08-06 02:44:35

当您使用jsonp作为数据类型(进行跨域请求) Jquery生成随机函数,并将其附加到请求的url作为名为回调(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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5359224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档