1

我有一个 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 响应正文?

注意:我已经看到使用 JSONP 时如何捕获 jQuery $.getJSON(或数据类型设置为“jsonp”的 $.ajax)错误?但这似乎与捕获错误有关,而不是与处理错误响应内容有关。

4

1 回答 1

3

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

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

解释:

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

解决方法:

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

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

于 2013-09-28T09:55:51.643 回答