繁体   English   中英

当 spring REST api 中缺少 header 时如何返回响应正文

[英]how to return a response body when header is missing in spring REST api

我正在将 header 传递给 spring REST api,例如:

@RequestHeader(value="test-header")

header 在这里对于 API 是强制性的,所以我不想让它可选。 当没有传递 header 时,对 API 的任何调用都会返回一个标准的 400 错误,指示该请求在语法上是错误的,然后它不会输入 REST API。但是,我想构造一个正确的 ResponseBody 并为此错误返回一个 json。 我不确定执行此操作的最佳方法。 我想过使用 spring 拦截器并检查这个 header 是否通过,但是我不确定我是否可以从这里创建一个 responsebody。 至少我不知道该怎么做。

拦截器方法是否适用于此? 如果是,如何? 如果没有,那么有哪些选择? 有人可以帮忙吗?

更新:

REST API 是这样的:

public void methodA(@RequestHeader(value="test-header") String header, @RequestBody User user, HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
...
...

} 

当header存在时,会进入REST API继续逻辑。 但是,如果 header 不存在,它就不会输入 API,只会返回标准的 400 错误。

我写的拦截器是这样的:

public class XXXInterceptor extends HandlerInterceptorAdapter { 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
...
...
...

return true;
}

}

第1步:使用@valid之类的spring验证程序注释来验证您的请求。

步骤2:编写您的自定义验证器类。 它将负责检查标头并查看其是否有值或具有预期值。

步骤3:如果请求不正确,验证器将引发您的自定义异常。

步骤4:编写您的异常处理程序类。 在类中定义如果捕获了STEP 3中的异常,我必须返回什么响应。

有关Spring异常处理的更多信息。

在我们当前的项目中,我们确实使用Java拦截器来验证请求,但没有其他方法。

正如您在问题中提到的,另一种方法是将Spring Interceptors( HandlerInterceptorAdapter )与@ControllerAdvice并在@ExceptionHandler方法中返回JSON。

看看下面的帖子: http : //www.journaldev.com/2651/spring-mvc-exception-handling-exceptionhandler-controlleradvice-handlerexceptionresolver-json-response-example

编写带有注释@ExceptionHandler的方法,并使用ServletRequestBindingException.class,因为如果未命中,则会抛出此异常。 您可以从此方法返回任何类型的对象。

例如

@ExceptionHandler(ServletRequestBindingException.class)
public ResponseEntity<ResponseObject> handleHeaderError(){

    ResponseObject responseObject=new ResponseObject();
    responseObject.setStatus(Constants.ResponseStatus.FAILURE.getStatus());
    responseObject.setMessage(header_missing_message);

    ResponseEntity<ResponseObject> responseEntity=new ResponseEntity<ResponseObject>(responseObject, HttpStatus.BAD_REQUEST);
    return responseEntity;
}

这来晚了,但是,处理此类问题的一种非常直接的方法是使用 Controller 建议 class,它允许您在一个全局处理组件中处理整个应用程序中的异常。

spring 抛出的异常是 MissingRequestHeaderException,然后您可以在 controller 建议 class 中提供自定义处理程序。

@Slf4j
@RestControllerAdvice
public class ControllerAdvice {

    @ExceptionHandler(MissingRequestHeaderException.class)
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    public ErrorResponse handleMissingRequestHeaderException(MissingRequestHeaderException ex) {
        log.error(ex.getMessage(), ex);
        return new ErrorResponse("Missing request header: " + ex.getHeaderName());
    }

}
public class ErrorResponse implements Serializable {
    
    private String message;

    public ErrorResponse(String message) {
        this.message = message;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM