24

这是我的代码:

      $.ajax({
        url: "/api/invoice/" + newInvoice._id,
        type: 'PUT',
        data: JSON.stringify(newInvoice),
        dataType: 'json',
        contentType: "application/json; charset=utf-8"
      })
        .success(function () {
          $('#statusLine').text('Successfully submitted invoice {0}. Click here to dismiss.'.format(newInvoice._id));
        })
        .error(function (err) {
          alert(err);
        });

请求:

PUT http://localhost:8000/api/invoice/16211 HTTP/1.1
Host: localhost:8000
Connection: keep-alive
Content-Length: 770
Origin: http://localhost:8000
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11
Content-Type: application/json; charset=UTF-8
Accept: application/json, text/javascript, */*; q=0.01
Referer: http://localhost:8000/invoice.html?id=16211
Accept-Encoding: gzip,deflate,sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

{"items":[{"id":...

请求正文实际上是一个有效的 json,为简洁起见,我只是将其截断。

响应:

HTTP/1.1 409 Conflict
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 1386
ETag: 250542419
Connection: keep-alive

{
  "msg": "Cannot update the invoice #16211, because it has already been updated by someone else.",
  "invoice": {
    "items": [
      {...

同样,响应是一个完全有效的 json,为简洁起见被截断。

正如预期的那样,处理程序是用对象error调用的。err但是,我怎样才能掌握解析的 json?当然,我可以检查响应的内容类型是否为 json,然后err.responseText自己解析,但这不是 jQuery ajax 应该为我做的吗?$.get我的意思是,当我从服务器获取对象时,它会为我的查询执行此操作。

我错过了什么?

编辑

这是对https://stackoverflow.com/a/12310751/80002的更正:

执行请求:

var ajax = $.ajax(...

处理错误响应:

var res, ct = ajax.getResponseHeader("content-type") || '';
if (ct.indexOf('json') > -1) {
  res = $.parseJSON(err.responseText);
  // process the response here
}
4

4 回答 4

46

我遇到了同样的问题,发现与@Barmar 的回答略有不同。

除了responseText,还有一个responseJSON属性,因此您可以执行以下操作:

var json_response = err.responseJSON.msg;

如果console.log(err);那里有一些属性,您可能希望在页面上的错误消息中使用它们。

于 2014-09-11T15:08:53.547 回答
26

对于带有非 200 1 HTTP 状态码的错误消息,jQuery 不会解析内容。如果您真的不想自己将返回的结果解析为 JSON,则必须返回 HTTP 状态 200 并使用success( done) 回调。

这是一个好兆头,您正在使用(来自您的示例)HTTP 代码 409,我认为您应该继续这样做 - 只需咬紧牙关并在错误处理程序中手动解析 JSON。如果解析失败,则说明其他问题(如临时网络故障),但这将允许您构建一个很好的 API,您(可能还有其他人)可以使用该 API,而无需在成功函数中构建太多错误检查。

success为快乐的结果而坚持,为不快乐的结果而坚持error

1从技术上讲,任何 2xx 状态都应视为成功;在 jQuery 中(status >= 200 && status < 300 || status === 304)算是成功的。

于 2012-09-07T01:51:26.510 回答
12

$.parseJSON在错误回调中显式调用:

(...)
.error(function (err) {
  var msg = $.parseJSON(err).msg;
  alert(msg);
});
于 2012-09-07T01:56:03.063 回答
0

获取 JSON 格式非常简单。它已经被 jQuery 推荐了。

var error = error.responseJSON
于 2020-05-09T20:10:21.237 回答