使用jquery从ajax响应中获取Http状态代码

时间:2022-10-08 23:39:39

In my current spring project, when I submit a form to server, the response is handled by this method:

在我当前的spring项目中,当我向服务器提交表单时,响应由此方法处理:

    $('form.form').each(function () {
        var form = this;
        $(form).ajaxForm(function (data) {
            form.reset();
            $(".alert-info").find("#alert").html(data);
            $(".alert-info").show();
        });
    });

In my controller, the submission is handled by a method like this:

在我的控制器中,提交由这样的方法处理:

@RequestMapping(value="cadastra", method=RequestMethod.POST)
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public void cadastra(@ModelAttribute("object") E object, BindingResult result, @RequestParam(value="file", required=false) MultipartFile file, @RequestParam(value="icone", required=false) MultipartFile icone, @RequestParam(value="screenshot", required=false) MultipartFile screenshot[]) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
    serv.cadastra(object);
    serv.upload_picture(object, file, "picture");
    serv.upload_picture(object, icone, "icone");
}

Error responses from the methods from the controller are handled by this ControllerAdvice class:

来自控制器的方法的错误响应由此ControllerAdvice类处理:

@ControllerAdvice
@PropertySource({"classpath:error.properties"})
public class GlobalDefaultExceptionHandler {

    @Autowired
    private Environment env;

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        // If the exception is annotated with @ResponseStatus rethrow it and let
        // the framework handle it - like the OrderNotFoundException example
        // at the start of this post.
        // AnnotationUtils is a Spring Framework utility class.
        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)
            throw e;
        // Otherwise setup and send the user to a default error-view.
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.addObject("url", req.getRequestURL());
        mav.addObject("msg", e.getLocalizedMessage());
        mav.setViewName("erro");
        return mav;
    }

}

I am looking for a way to read the http status code from response (which can be 1xx, 2xx, 3xx, 4xx or 5xx) in my jquery code, and display a related message according to this code.

我正在寻找一种方法来从我的jquery代码中读取响应中的http状态代码(可以是1xx,2xx,3xx,4xx或5xx),并根据此代码显示相关消息。

In the network monitor from browser, I can see a successful response already have the code HTTP 201 as implemented in the method; when an error occurs, the response should have a code 4xx or 5xx, depending from exception triggered.

在浏览器的网络监视器中,我可以看到成功的响应已经在方法中实现了代码HTTP 201;发生错误时,响应应具有代码4xx或5xx,具体取决于触发的异常。

In this way, I wonder if anyone can give a hint of how modify my jquery code and my COntrollerAdvice to accomplish this.

通过这种方式,我想知道是否有人可以提示如何修改我的jquery代码和我的COntrollerAdvice来实现这一目标。

3 个解决方案

#1


4  

It looks like you are using the jQuery Form Plugin. If so, the third parameter to the callback function is the xhr object, and you can get the HTTP status like this:

看起来你正在使用jQuery Form Plugin。如果是这样,回调函数的第三个参数是xhr对象,你可以得到如下的HTTP状态:

$(form).ajaxForm(function (data, statusText, xhr) {
    alert(xhr.status);

jsfiddle

的jsfiddle

#2


2  

Like this:

喜欢这个:

$.ajax({
    type: "post", url: "/SomeController/SomeAction",
    success: function (data, text) {
        //...
    },
    error: function (request, status, error) {
        alert(request.responseText);
    }
});

e.g.

例如

error: function(xhr,err){
    alert("readyState: "+xhr.readyState+"\nstatus: "+xhr.status);
    alert("responseText: "+xhr.responseText);
}

xhr is short for XmlHttpRequest.

xhr是XmlHttpRequest的缩写。

readyState: the values are 1:loading, 2:loaded, 3:interactive, 4:complete

readyState:值为1:loading,2:loaded,3:interactive,4:complete

status: the HTTP status number, like 404 not found, 500 internal server error, 200: ok (warning: special IE problem value: 0 cancelled)

status:HTTP状态号,如404未找到,500内部服务器错误,200:ok(警告:特殊IE问题值:0已取消)

responseText: the response from the server - this could be your custom status text (make sure the status code is not 200 OK)

responseText:来自服务器的响应 - 这可能是您的自定义状态文本(确保状态代码不是200 OK)

If you want to check the status even on success, use always:

如果要在成功时检查状态,请始终使用:

var jqxhr = $.ajax( "example.php" )
.done(function (data) { alert(data); })
.fail(function (jqXHR, textStatus, errorThrown) { someErrorFunction(); })
.always(function() { alert("complete"); });

Also, see this post on success-error-complete vs. done-fail-always
jQuery ajax() using success, error and complete vs .done(), .fail() and always()

另外,请看成功错误完成与完成失败 - 总是jQuery ajax()使用成功,错误和完整vs .done(),. fail()和always()

If you want to setup a global error handling on the page, use ajaxSetup:
http://www.unseenrevolution.com/jquery-ajax-error-handling-function/

如果要在页面上设置全局错误处理,请使用ajaxSetup:http://www.unseenrevolution.com/jquery-ajax-error-handling-function/

#3


2  

To get headers and status in response:

获取标题和状态作为响应:

$.ajax({
    dataType: "json",
    url: url,
    data: data
}).done(function(rs, textStatus, xhr) {
    console.log(xhr.getResponseHeader('X-CUSTOM-HEADER'));
    console.log(xhr.status);
});

see also: Using getResponseHeader with jQuery’s ajax method

另请参阅:使用jQuery的ajax方法使用getResponseHeader

#1


4  

It looks like you are using the jQuery Form Plugin. If so, the third parameter to the callback function is the xhr object, and you can get the HTTP status like this:

看起来你正在使用jQuery Form Plugin。如果是这样,回调函数的第三个参数是xhr对象,你可以得到如下的HTTP状态:

$(form).ajaxForm(function (data, statusText, xhr) {
    alert(xhr.status);

jsfiddle

的jsfiddle

#2


2  

Like this:

喜欢这个:

$.ajax({
    type: "post", url: "/SomeController/SomeAction",
    success: function (data, text) {
        //...
    },
    error: function (request, status, error) {
        alert(request.responseText);
    }
});

e.g.

例如

error: function(xhr,err){
    alert("readyState: "+xhr.readyState+"\nstatus: "+xhr.status);
    alert("responseText: "+xhr.responseText);
}

xhr is short for XmlHttpRequest.

xhr是XmlHttpRequest的缩写。

readyState: the values are 1:loading, 2:loaded, 3:interactive, 4:complete

readyState:值为1:loading,2:loaded,3:interactive,4:complete

status: the HTTP status number, like 404 not found, 500 internal server error, 200: ok (warning: special IE problem value: 0 cancelled)

status:HTTP状态号,如404未找到,500内部服务器错误,200:ok(警告:特殊IE问题值:0已取消)

responseText: the response from the server - this could be your custom status text (make sure the status code is not 200 OK)

responseText:来自服务器的响应 - 这可能是您的自定义状态文本(确保状态代码不是200 OK)

If you want to check the status even on success, use always:

如果要在成功时检查状态,请始终使用:

var jqxhr = $.ajax( "example.php" )
.done(function (data) { alert(data); })
.fail(function (jqXHR, textStatus, errorThrown) { someErrorFunction(); })
.always(function() { alert("complete"); });

Also, see this post on success-error-complete vs. done-fail-always
jQuery ajax() using success, error and complete vs .done(), .fail() and always()

另外,请看成功错误完成与完成失败 - 总是jQuery ajax()使用成功,错误和完整vs .done(),. fail()和always()

If you want to setup a global error handling on the page, use ajaxSetup:
http://www.unseenrevolution.com/jquery-ajax-error-handling-function/

如果要在页面上设置全局错误处理,请使用ajaxSetup:http://www.unseenrevolution.com/jquery-ajax-error-handling-function/

#3


2  

To get headers and status in response:

获取标题和状态作为响应:

$.ajax({
    dataType: "json",
    url: url,
    data: data
}).done(function(rs, textStatus, xhr) {
    console.log(xhr.getResponseHeader('X-CUSTOM-HEADER'));
    console.log(xhr.status);
});

see also: Using getResponseHeader with jQuery’s ajax method

另请参阅:使用jQuery的ajax方法使用getResponseHeader