【问题标题】:jquery ajax does not parse json on failurejquery ajax 在失败时不解析 json
【发布时间】:2012-03-22 11:29:38
【问题描述】:

jQuery 的 jqXHR 对象在失败时传递给回调不解析 json 响应,因此 responseJSON 未定义,只有 responseText 可用。

它适用于成功的请求,我正在使用 dataType: 'json' 设置正确的标头

呼叫:

  $.ajax({
    type: 'POST',
    url: $form.attr('action'),
    data: post_data,
    dataType: 'json',
    done: done_callback,
    fail: fail_callback,
    always: always_callback
  });

请求标头:

Accept:application/json, text/javascript, */*; q=0.01
X-Requested-With:XMLHttpRequest
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.83 Safari/535.11

响应标头:

Content-Type:application/json;charset=utf-8
Status:500

响应文本:

{"status":"error","code":500,"message":"A system error occurred, please try again later"}

responseJSON 未定义

是不是jQuery响应ajax请求不成功时不解析json的情况? 我找不到任何文件来确认或否认这种行为(我可能只是不够努力)

我显然可以在fail 回调中使用parseJSON

【问题讨论】:

  • 你是对的。响应内容不是evaled 错误。如果您在 500 错误时收到 JSON,只需自己解析即可。
  • 是的。 @Arun 非常正确地向我指出了 jquery 已决定不通过类型转换器传递响应的确切行。

标签: jquery


【解决方案1】:

我查看了 jQuery ajax 回调方法。只有当( status >= 200 && status < 300 || status === 304 ) 为真时,它才会进行dataType 转换;否则,响应将被传递给相应的处理程序。也就是说,如果请求失败,则不会按照预期的dataType 解析响应。

如果您想了解更多信息,可以在 jquery.js 文件中查找上述条件并查看它是否有效。

【讨论】:

  • 确实,你是正确的。你知道为什么 jquery 有这个专门编码,看起来很奇怪,响应数据即使对于错误也是有效的。 HTTP1.1 说“除了响应 HEAD 请求时,服务器应该包含一个包含错误情况解释的实体”
  • 我认为这是因为他们假设如果请求失败,那么响应内容可能不可靠
  • 这不再是真的:bugs.jquery.com/ticket/13917#comment:2 "截至本次提交:[…] 解析的 JSON 可在失败的情况下作为 jqXHR 实例的 responseJSON 字段使用。 "
  • @Ashe / Amelia 您所指的那张票中的评论似乎不准确。如果您在从票证评论链接的提交消息中向上滚动一点,它是becomes obvious
  • @jpaugh:(a)我们在这里谈论的是 5 年前的代码,只是为了清楚起见。 (b) 这对我来说不是很明显吗? The test case 看起来很清晰。
【解决方案2】:

从 jQuery 1.5 版本开始,添加了 statusCode 处理程序:

$.ajax({
  statusCode: {
    404: function() {
      alert("page not found");
    }
  }
});

但是在早期版本中,当返回错误状态时,您应该单独解析响应文本:

$.ajax({
  success: function(response) {
    data = $.evalJSON(response);
    alert(data);
  },
  error: function(response) {
    data = $.evalJSON(response.responseText);
    alert(data);
  }
});

【讨论】:

  • 我认为原生函数是 parseJSON 而不是 evalJSON,我得到:“evalJSON is not a function” using jQuery 1.11.0
【解决方案3】:

我猜你要找的是data.statusdata.statusText

【讨论】:

  • 一个“数据”对象没有传递给失败回调,只有成功,我想要我的json作为一个对象
  • 这对我来说是新的,我构建的应用程序是一个包含大约 100 次 ajax 调用的 web 应用程序,我在每个应用程序中都使用了 'error: function (data) { alert("data: " + data.status + " " + data.statusText); }' 我没有问题
  • data.statusText 正是 HTTP1.1 在我的情况下定义的文本“内部服务器错误”这不是我想要的,我想要类型链接后的实际响应对象,而不是 XHR 对象,就像您收到成功回调一样。例如。 {error:"error",status:500,message:"We are unable to receive your message right now."}
猜你喜欢
  • 2021-11-04
  • 2018-01-07
  • 1970-01-01
  • 2012-03-09
  • 2015-01-19
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多