如何使用jQuery获取HTTP状态代码?


75

我想检查页面是否返回状态码401。这可能吗?

这是我的尝试,但只返回0。

$.ajax({
    url: "http://my-ip/test/test.php",
    data: {},
    complete: function(xhr, statusText){
    alert(xhr.status); 
    }
});

检查statusText回调函数的第二个参数的值。
Jimmy Cuadra 2010年

1
这将提示“需要授权”。我可以使用它,但是401警报会更好;)
霍尔根(Horgen

Answers:


97

这是可能的jQuery$.ajax()方法

$.ajax(serverUrl, {
   type: OutageViewModel.Id() == 0 ? "POST" : "PUT",
   data: dataToSave,
   statusCode: {
      200: function (response) {
         alert('1');
         AfterSavedAll();
      },
      201: function (response) {
         alert('1');
         AfterSavedAll();
      },
      400: function (response) {
         alert('1');
         bootbox.alert('<span style="color:Red;">Error While Saving Outage Entry Please Check</span>', function () { });
      },
      404: function (response) {
         alert('1');
         bootbox.alert('<span style="color:Red;">Error While Saving Outage Entry Please Check</span>', function () { });
      }
   }, success: function () {
      alert('1');
   },
});

24
因此,改变400到401
迈克·张伯伦

1
@StuckBetweenTrees有什么关系?
超级英雄

请注意,代码200(完成)参数是数据,而其他参数(失败)是jqXHR
Nick Tsai

68

第三个参数是XMLHttpRequest对象,因此您可以执行所需的任何操作。

$.ajax({
  url  : 'http://example.com',
  type : 'post',
  data : 'a=b'
}).done(function(data, statusText, xhr){
  var status = xhr.status;                //200
  var head = xhr.getAllResponseHeaders(); //Detail header info
});

它返回以下内容:XMLHttpRequest无法加载example.com。请求的资源上不存在“ Access-Control-Allow-Origin”标头。因此,不允许访问源“ stackoverflow.com ”。
悉尼,2015年

您将必须启用CORS处理才能摆脱“访问控制权-允许来源”问题。根据您正在处理的项目类型,您可能无法简单地解决此问题,特别是如果API位于不同的域中并且不允许跨域请求
AnBisw

@Annjawn如何处理CORS,就像我用Php进行相同的API调用一样,它不会给出任何CORS错误,但如果我是同一API调用的ajax,我就会给出CORS的错误。请让我知道
MD Shahrouq,

2
如果状态代码为400(并且可能对于其他非200的代码)
则将

20

使用错误回调。

例如:

jQuery.ajax({'url': '/this_is_not_found', data: {}, error: function(xhr, status) {
    alert(xhr.status); }
});

会提示404


确实如此。我是jQuery的新手。但是401状态如何?如何将状态保存到变量?o_O
霍尔根(Horgen)2010年

它将以相同方式显示401。您究竟要如何处理该错误?
baloo 2010年

如果401不要将用户发送到此页面。该错误仅在找不到页面的情况下警告(404)
霍尔根

在Firefox它逮住401以及测试了这个,也许这并不是对所有的浏览器真正的
baloo

10

我认为您还应该实现$ .ajax方法的错误功能。

错误(XMLHttpRequest,textStatus,errorThrown)功能

如果请求失败,将调用的函数。该函数传递了三个参数:XMLHttpRequest对象,描述发生的错误类型的字符串和可选的异常对象(如果发生)。第二个参数(除null外)的可能值为“超时”,“错误”,“未修改”和“ parsererror”。

$.ajax({
    url: "http://my-ip/test/test.php",
    data: {},
    complete: function(xhr, statusText){
        alert(xhr.status); 
    },
    error: function(xhr, statusText, err){
        alert("Error:" + xhr.status); 
    }
});

3
thx,但是complete只返回0。可以获取401代码吗?
霍尔根(Horgen)2010年

从服务器返回HTTP 401(未经授权)时,您确定会调用complete吗?我尚未测试,但我希望会调用该错误。
GvS 2010年

complete类型:Function(jqXHR jqXHR,String textStatus)请求完成时(在执行成功和错误回调之后)将调用的函数。该函数传递了两个参数:jqXHR(在jQuery 1.4.x中,XMLHTTPRequest)对象和一个对请求状态进行分类的字符串(“成功”,“未修改”,“错误”,“超时”,“中止”或“ parsererror”)。从jQuery 1.5开始,完整设置可以接受函数数组。每个函数将依次调用。这是一个Ajax事件。
pshirishreddy 2013年

9

我找到了该解决方案,您可以在其中简单地使用状态码检查服务器响应代码

范例:

$.ajax({
type : "POST",
url : "/package/callApi/createUser",
data : JSON.stringify(data),
contentType: "application/json; charset=UTF-8",
success: function (response) {  
    alert("Account created");
},
statusCode: {
    403: function() {
       // Only if your server returns a 403 status code can it come in this block. :-)
        alert("Username already exist");
    }
},
error: function (e) {
    alert("Server error - " + e);
} 
});

2
如果响应不成功,并且响应状态码甚至不为403,则转到错误块。
Jigar Trivedi 2015年

6
$.ajax({
    url: "http://my-ip/test/test.php",
    data: {},
    error: function(xhr, statusText, errorThrown){alert(xhr.status);}
});

3

我将jQuery Ajax封装为一个方法:

var http_util = function (type, url, params, success_handler, error_handler, base_url) {

    if(base_url) {
        url = base_url + url;
    }

    var success = arguments[3]?arguments[3]:function(){};
    var error = arguments[4]?arguments[4]:function(){};



    $.ajax({
        type: type,
        url: url,
        dataType: 'json',
        data: params,
        success: function (data, textStatus, xhr) {

            if(textStatus === 'success'){
                success(xhr.code, data);   // there returns the status code
            }
        },
        error: function (xhr, error_text, statusText) {

            error(xhr.code, xhr);  // there returns the status code
        }
    })

}

用法:

http_util('get', 'http://localhost:8000/user/list/', null, function (status_code, data) {
    console(status_code, data)
}, function(status_code, err){
    console(status_code, err)
})

1

我在ajax + jQuery v3上遇到了主要问题,同时从JSON API获取响应状态代码和数据。jQuery.ajax仅在状态为成功时解码JSON数据,并且还会根据状态代码围绕回调参数的顺序进行交换。g。

解决此问题的最佳方法是调用.alwayschain方法并进行一些清理。这是我的代码。

$.ajax({
        ...
    }).always(function(data, textStatus, xhr) {
        var responseCode = null;
        if (textStatus === "error") {
            // data variable is actually xhr
            responseCode = data.status;
            if (data.responseText) {
                try {
                    data = JSON.parse(data.responseText);
                } catch (e) {
                    // Ignore
                }
            }
        } else {
            responseCode = xhr.status;
        }

        console.log("Response code", responseCode);
        console.log("JSON Data", data);
    });

-1

在WAMP SERVER apache2中测试

abrir el httpd.conf和agregar esto:

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "*"
</IfModule>

在apache headers_module上启用下一个模块

重新启动所有服务


1
欢迎使用StackOverflow :-)请仅以英语回答,并添加一两个句子,说明您的建议为何可行。
Gogowitsch
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.