jQuery如何检查Ajax调用的响应类型


71

如何确定Jquery中Ajax调用的响应类型?有时,服务器发送json响应,有时仅发送html进行显示。现在我正在使用

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

您是否尝试查看响应的标头MIME类型?
迪克

1
您可以通过typeof response=="object"
Imdad

Answers:


129

您可以尝试如下操作:

$.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。
Ankit Jaiswal,2010年

非常感谢。这恰好是我在寻找的东西。我希望jquery有一个快捷方式:)
sam 2010年

谢谢你……应该意识到我们可以看看标题了;)
Richard B

3
顺便说一句,对于任何感兴趣的人,如果您致电xhr.getResponseHeader()(不带参数),则会导致Cannot call method 'toLowerCase' of undefined错误
periklis 2014年

@AnkitJaiswal的作品很棒。好的答案,谢谢
阿巴斯·加利亚科瓦拉

18

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

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

如果使用此方法,则不必在成功回调中编写2个额外的参数。


这有点麻烦,但这是最简单的解决方案。
Csongor Fagyal 2015年

我总能到达"string"那里
亚历克斯(Alex)

10

如果将响应解析为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文档中

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


这是不准确的,因为响应“水合”取决于您要求的格式。我测试了类似的调用,$.ajax({.., dataType: 'html'})并且从服务器端发送了application/json响应,但是jQuery并未填充jqXHR.responseJSON字段。
Mateo Tibaquira 2014年

确实,但是OP希望知道响应类型。为什么要指定dataType: 'html'是否知道服务器将不发送“ html”?可能指定dataType强制jQuery使用该数据类型,从而跳过自动检测。
tyrion

是的,可能是这样,但就我而言,如果我不指定html请求,symfony会以不需要的JSON格式返回表单。确实是具体情况。
Mateo Tibaquira 2014年

1
好吧,我认为此解决方案会起作用,但它的通用性还不够,因为它也可用于XML(jqXHR.responseXML),但不适用于HTML(和其他类型)。对我而言,最通用的方法仍然是jqXHR.getResponseHeader('content-type')。
Möhre

8

上面的答案对我没有用,所以我想出了以下解决方案:

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”,则这可能行不通
Steven

0

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

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

当然,我可以要求服务器返回一个格式为JSON的逻辑错误,但是当服务器关闭或损坏时,您将不会得到JSON正文。
伊万2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.