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

jsonp内容类型为jQuery.ajax请求后的parsererror,jquery,jsonp,jquery-1.5,parse-error,Jquery,Jsonp,Jquery 1.5,Parse Error,我使用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, erro

我使用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”作为数据类型而不是“jsonp”进行ajax调用,服务器将以空字符串进行响应。

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

本质上,脚本标记会动态插入到文档中,如下所示:

<script src="http://the.other.server.com/foo?callback=someFn"></script>
someFn作为请求的一部分传递,因此服务器需要读取它并适当地包装数据


这都是假设您从另一个域获取内容。如果是这样的话,您将受到同源策略的限制:

您真的不应该在这里指定jsonp。只需使用json,因为您刚刚收到一个json字符串。json(带填充的json)需要执行javascript函数。在这种情况下,您需要在querystring中指定一个“callback=”。我想这就是jQuery无法处理此问题的原因,因为有一个名为callback的属性。

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

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

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

升级到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的一个实例,代码可以在这里找到)

当您使用jsonp作为数据类型(发出跨域请求)时,Jquery生成随机函数并将其作为名为callback(callback=?)的查询字符串追加到请求的url,您需要将响应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。它要求服务器在其结果中设置回调函数。我使用它从返回纯json但不支持jsonp(但将来可能会)的站点获取json响应:


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

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

确保在WebApiConfig.Register中有一行如下所示

插入(0,新的JsonpMediaTypeFormatter(新的JsonMediaTypeFormatter(),“回调”)


我当时正在为这件事发愁。希望这对其他人有所帮助。

在我没有在url中添加参数“callback=?”或“c=?”之前,我遇到了相同的问题

比如:“+resource+”.json&c=?”


也许能解决你的问题。这对我来说很有效。

如果我只使用json进行请求,我会得到一个空字符串作为答案。可能是api坏了吗?如果是这样的话,有没有办法在js中破解这个问题?你是说“jsonp(带填充的json)”,而不是“json(带填充的json)”。问题中的API是供应商提供的公共API。它只是将调用限制为仅jsonp。Jsonp调用被应答,但作为一个普通的Json对象;谢天谢地,真希望他们能加上一些精彩的纪录片。我看不懂这个。您的意思是我需要用以下代码包装来自服务器的响应,例如:$callBack({$myJsonResult});我将在服务器端执行此操作?@AdamMorris服务器如何知道此功能?我指的是JQuery1519935275333671539_1300495251986中的那个长号码?如何将这些信息传递给服务器?非常感谢您的回答!API现在工作起来很有魅力:)起初我使用API客户端,但我想坚持只使用jquery的方法。您也可以将客户端与jquery一起使用。它将自动检测Prototype或jQuery并使用给定的方法。(Y) 我真的希望这能起作用,因为它看起来很聪明,但是
jqXHR.responseText
总是未定义的…不,这不会修复jQuery.ajax请求后jsonp内容类型的解析器错误
 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));
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;
    });
}