代码之家  ›  专栏  ›  技术社区  ›  Alvin

如何使用响应对象返回状态代码?

  •  0
  • Alvin  · 技术社区  · 5 年前

    我应该如何将状态代码设置为401?

    public class Response<T> {
    
        private Status status;
        private T payload;
        private Object errors;
        private Object metadata;
    
        public static <T> Response<T> unauthorized() {
            Response<T> response = new Response<>();
            response.setStatus(Status.UNAUTHORIZED);
            return response;
        }
    

    控制器:

    public Response fail(@RequestBody AuthRefreshRequest authRefreshRequest) throws Exception {
        return Response.unauthorized();
    }
    

    但返回状态总是200

    0 回复  |  直到 5 年前
        1
  •  1
  •   Mark Bramnik    5 年前

    默认情况下,如果从 @RestController spring将其转换为JSON/XML,并将http状态代码200添加到响应中。这是有道理的,因为流并没有“异常地”结束,也就是说,异常没有被抛出。

    从概念上讲,有两种方法可以改变这种行为:

    1. 对响应进行更细粒度的控制:尽管返回的对象确实有一些数据,但返回一些非200状态代码。

    2. 抛出异常并利用spring异常处理mvc集成。

    这个 第一 通过一个简单的重构就可以很容易地实现:

    从列表中删除状态 Response 对象,通常倾向于删除这一抽象级别:从控制器返回业务域中的对象。Spring已经有了这样一个抽象概念:它被称为 org.springframework.http.ResponseEntity :

    Assuming your have a "Payload" object:
    
    public ResponseEntity<Payload> fail(...) {
    
       Payload payload = ...
       return new ResponseEntity(payload, HttpStatus.UNAUTHORIZED);
    }
    
    

    这个 第二 方法(基于异常)应该在执行代码时使用,这样服务器就不能真正执行请求,并且从“业务逻辑角度”来看,它会抛出异常。

    在这种情况下,您可以抛出包含一些消息、应用程序错误代码、状态代码或其他内容的异常,并放置一个控制器建议,在异常“离开”控制器后拦截该异常(根据堆栈跟踪)——这是一个允许“自定义”响应的钩子:放置状态代码、头、构建响应体、,无论什么这个“Controller建议”是处理在Spring MVC中以异常结束的流程的方法之一,但是还有许多其他的,总之,异常处理在Spring MVC中是一个广泛的主题,所以如果您需要,请考虑阅读。 this tutorial 例如(还有很多其他的)。

        2
  •  0
  •   Qiu Zhou    5 年前

    您可以通过添加响应拦截器来实现这一点 ResponseBodyAdvice ,其中将退货状态设置为 status 响应对象中的代码:

    @ControllerAdvice
    public class ResponseIntercepter implements ResponseBodyAdvice<Response> {
        @Override
        public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
            return true;
        }
    
        @Override
        public Response beforeBodyWrite(Response body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
            // here set the return status (need to convert your own Status to org.springframework.http.HttpStatus)
            serverHttpResponse.setStatusCode(body.getStatus());
            return body;
        }
    }