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

Tho*_*mas 57 jquery jsonp parse-error jquery-1.5

我使用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); }
});
Run Code Online (Sandbox Code Playgroud)

服务器使用有效的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"
       }
     }
   }
 }
Run Code Online (Sandbox Code Playgroud)

但是从不调用成功回调,而是错误回调产生了这个输出:

jQuery15109935275333671539_1300495251986 was not called
parsererror
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

我没有使用jQuery的额外库.

编辑:

如果我尝试使用"json"作为dataType而不是"jsonp"进行ajax调用,则服务器以空字符串响应.

Eva*_*oli 58

JSONP要求响应包含在某种回调函数中,因为它通过将脚本标记注入文档作为从另一个域加载数据的机制来工作.

基本上,会发生什么是脚本标记动态插入到文档中,如下所示:

<script src="http://the.other.server.com/foo?callback=someFn"></script>
Run Code Online (Sandbox Code Playgroud)

callback取决于您正在调用的资源,但参数通常是常见的callback.

someFn 然后用于处理来自服务器的返回数据,因此服务器应该响应:

someFn({theData: 'here'});
Run Code Online (Sandbox Code Playgroud)

someFn作为请求的一部分传递,因此服务器需要读取它并适当地包装数据.

这是假设您正在抓取其他域中的内容.如果是这样,您受到相同的原始政策限制:http://en.wikipedia.org/wiki/Same_origin_policy

  • 在此示例中,someFn是回调,服务器应响应:jQuery15109935275333671539_1300495251986({...}); (8认同)
  • +1整天都在努力争取这个... -.- (6认同)
  • 问题中的API是供应商提供的公共API.它只是将调用限制为jsonp.Jsonp调用被回答,但作为一个普通的Json对象. (3认同)
  • 我无法理解这个.你的意思是我需要用服务器来包装响应,例如:$ callBack({$ myJsonResult}); 我会在服务器端做那个吗? (3认同)
  • 感谢上帝,希望他们能够添加一些文档 (2认同)

Bry*_*yan 9

升级到Jquery 1.5并尝试跨域调用后,我遇到了同样的问题.最终我发现$ .getJSON有效.特别,

$.getJSON(url,
    function(data){
        yourFunction(data);
       return false;
    });
Run Code Online (Sandbox Code Playgroud)

我使用的URL是这样的:

var url = WEB_SERVER_URL;
url = url + "&a=" + lat;
url = url + "&b=" + lng; ....
url = url + "&jsoncallback=?";
Run Code Online (Sandbox Code Playgroud)

在另一台服务器上运行的服务器中,我控制了这段代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

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


小智 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
Run Code Online (Sandbox Code Playgroud)

响应数据应如下所示:

 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));
Run Code Online (Sandbox Code Playgroud)

阅读更多关于: 使用jsonp内容类型的jquery.ajax请求之后的parsererror

在此输入图像描述