【问题标题】:jquery how to check response type for ajax calljquery如何检查ajax调用的响应类型
【发布时间】:2011-04-14 02:00:35
【问题描述】:

如何确定 Jquery 中 ajax 调用的响应类型?有时,服务器发送 json 响应,有时它只发送 html 用于显示目的。现在我正在使用

if(response.indexOf('Error'))
  //popup error message
else
 response.username
 response.address

【问题讨论】:

  • 您是否尝试查看响应的标头 MIME 类型?
  • 可以通过typeof response=="object"查看

标签: jquery ajax


【解决方案1】:

你可以试试:

$.ajax({
  type: "POST",
  url: "your url goes here", 
  data: "data to be sent", 
  success: function(response, status, xhr){ 
    var ct = xhr.getResponseHeader("content-type") || "";
    if (ct.indexOf('html') > -1) {
      //do something
    }
    if (ct.indexOf('json') > -1) {
      // handle json here
    } 
  }
});

基本上它也使用 indexOf 但它似乎更可靠。

【讨论】:

  • 顺便说一句,我建议您尽可能只使用一种格式。就像即使您显示一些简单的消息,您也可以使用 json。
  • 非常感谢。这正是我正在寻找的,或者。我希望 jquery 有一个快捷方式:)
  • 谢谢你...应该意识到我们可以看看标题 ;)
  • 顺便说一句,对于任何感兴趣的人,如果您调用 xhr.getResponseHeader()(不带参数),它会导致 Cannot call method 'toLowerCase' of undefined 错误
  • @AnkitJaiswal 它的作品很棒。很好的答案谢谢你
【解决方案2】:

要接受 JSON 回复,您可以将回复类型设置为 JSON。我通常设计我的服务器端代码,所以它们总是返回 JSON 回复。如果由于某种原因它未能这样做,我会在我的 AJAX 调用中收到错误,因为 JSON 格式不正确,我可以将来自服务器的回复处理为不是非 JSON。

error: function(response, status, xhr){ 
// do something with the reply.
}

【讨论】:

  • off-course 我可以要求我的服务器返回格式为 JSON 的逻辑错误,但是当您的服务器关闭或损坏时,您将不会得到 json 正文。
【解决方案3】:

上面的答案对我不起作用,所以我想出了这个解决方案:

success: function(data, textStatus , xhr) {
if(xhr.responseXML.contentType == "text/html") {
    //do something with html
    }
else if(xhr.responseXML.contentType == "application/json") {
    //do something with json
    }}

【讨论】:

  • 如果内容类型例如“text/html; charset=UTF-8”,这可能不起作用
【解决方案4】:

您可以简单地使用 javascript 的简单方法来检查类型

if(typeof response=="object")
{
 // Response is javascript object
}
else
{
 // Response is HTML
}

如果你使用这种方法,你不必在成功回调中额外写2个参数。

【讨论】:

  • 这有点小技巧,但它是最简单的解决方案。
  • 我总是在那里得到"string"
  • 这不起作用。如果服务器返回 text/html 作为内容类型,它仍然是一个对象。
  • 没错。在这种情况下,它也很有用,因为您需要在将其转换为 Object 之前进行检查,因为它还没有。最佳做法是返回正确的标头。
【解决方案5】:

如果响应被解析为 JSON,jqXHR 对象将具有 responseJSON 属性。

$.ajax(
    // ...
).done(function(data, textStatus, jqXHR) {
    if (jqXHR.responseJSON) {
        // handle JSON
    } else {
        // handle html
    }
}).fail(function(jqXHR, textStatus, errorThrown) {
    if (jqXHR.responseJSON) {
        // handle JSON
    else {
        // handle html
    }
})

来自jQuery.ajax documentation

如果指定了 json,则使用 jQuery.parseJSON 解析响应,然后将其作为对象传递给成功处理程序。解析后的 JSON 对象可通过 jqXHR 对象的 responseJSON 属性获得。

【讨论】:

  • 这不准确,因为响应“水合”取决于您询问的格式。我测试了类似$.ajax({.., dataType: 'html'}) 的调用,并从服务器端发送了application/json 响应,但jQuery 没有填充jqXHR.responseJSON 字段。
  • 确实,但 OP 想知道响应类型。如果您知道服务器不会发送“html”,为什么还要指定dataType: 'html'?可能指定 dataType 会强制 jQuery 使用该数据类型,跳过自动检测。
  • 是的,可能,但就我而言,如果我没有指定html 请求,symfony 会返回我不想要的 JSON 格式的表单。确实是具体情况。
  • 好吧,我认为这个解决方案会起作用,但它不够通用,因为它也适用于 XML (jqXHR.responseXML),但不适用于 HTML(和其他类型)。对我来说最通用的方式仍然是 jqXHR.getResponseHeader('content-type')。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 2015-12-24
  • 2011-03-11
相关资源
最近更新 更多