使用JSONP时如何处理jQuery $ .getJSON错误响应?

时间:2013-09-26 08:10:15

标签: jquery ajax jsonp

我有一个RESTful应用程序在遇到应用程序错误时返回带有JSON编码的响应主体的HTTP 400:

Request URL:    http://.../middleware.php/entity/23.json?padding=jQuery20305847647329799524_1380182255277&_=1380182255278
Request Method: GET
Status Code:    HTTP/1.1 400 Bad Request

Server: Apache/2.2.14 (Ubuntu)
Date:   Thu, 26 Sep 2013 07:57:36 GMT
Content-Type:   application/json
Content-Length: 133

根据FF:

,响应正文是有效的JSONP
jQuery20305847647329799524_1380182255277({"version":"0.2","exception":{"message":"Invalid UUID: '23'","type":"Exception","code":0}});

我正在努力处理失败:

$.getJSON("http://demo.volkszaehler.org/middleware.php/entity/23.json?padding=?").fail(
    function(jqXHR, textStatus, errorThrown) { 
        console.error(JSON.stringify(jqXHR));
        console.error(jqXHR.responseText);
    }
);

不幸的是,jqXHR在FF25和Chrome上只有以下属性:

{"readyState":4,"status":404,"statusText":"error"}

responseText本身显示为"",我无法解码操作JSON响应正文。

如何在fail()方法中解析实际的JSON响应正文?

注意:我见过How do I catch jQuery $.getJSON (or $.ajax with datatype set to 'jsonp') error when using JSONP?但它似乎与捕获错误有关,而与处理错误响应内容无关。

1 个答案:

答案 0 :(得分:3)

回答(在@Felix Kling的帮助下):

如果JSONP服务器返回HTTP 400状态,则无法接收JSONP响应。

<强>解释

JSONP的工作原理是使客户端包含一个远程(服务器端)Javascript,在客户端执行时生成所需的JSON响应。在HTTP 400的情况下,脚本永远不会在客户端执行。

<强>解决方法:

  • 始终使用HTTP 200 OK或
  • 返回JSONP错误消息/异常
  • 使用跨源资源共享(CORS)。在客户端上使用jQuery时,启用CORS的最简单方法是在服务器上设置额外的Access-Control-Allow-Origin: *标头。

有关CORS的进一步阅读,请参阅http://docs.kendoui.com/howto/use-cors-with-all-modern-browsershttp://www.html5rocks.com/en/tutorials/cors/?redirect_from_locale=de#toc-cors-from-jquery