spring 无法在错误时从Sping Boot REST API获取响应正文

0dxa2lsx  于 2023-08-02  发布在  Spring
关注(0)|答案(2)|浏览(109)

我花了太多时间在这上面,我想我会分享我发现的东西。我很惊讶我找不到这些信息,因为它似乎是任何应用程序都必须拥有的。
我希望能够在发生错误时从Sping Boot REST API将额外的数据发送回客户端。大概是这样的:

>curl -i GET https://api.twitter.com/1.1/statuses/update.json?include_entities=true
HTTP/1.1 400 Bad Request
date: Fri, 14 Jul 2023 15:23:34 GMT
content-type: application/json; charset=utf-8
cache-control: no-cache, no-store, max-age=0
content-length: 62

{"errors":[{"code":215,"message":"Bad Authentication data."}]}

字符串
我可以用curl来实现这一点,但是在浏览器中,没有收到响应数据。我使用Google开发工具查看网络流量确认了这一点。数据是从我的REST API发送的。
我本来希望在这些链接中找到一些有用的信息,但我没有。
Error Handling for REST with Spring
Best Practices for REST API Error Handling

bxpogfeg

bxpogfeg1#

解决方案是CORS相关问题。将Access-Control-Allow-Origin添加到header是解决方案。
如果要全局捕获所有异常并发回有意义的响应,需要执行以下操作。原谅我,因为我是新来的,所以如果有什么我错过了,请让我知道。
全局异常处理程序:

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler
    public ResponseEntity<UserResponseException> handleException(Exception ex) {
        return ResponseException.ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR, ex.getMessage());
    }
    // Add more handlers as needed. 
}

字符串
和我的响应异常类

@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ResponseException {
    private int status;
    private List<String> messages;
    // add anything else you want to return

    public static ResponseEntity<ResponseException> ResponseEntity(HttpStatus status, List<String> messages) {
        ResponseException ure = new ResponseException(status.value(), messages);
        HttpHeaders headers = new HttpHeaders();
        headers.set("Access-Control-Allow-Origin", "*");
        return new ResponseEntity<ResponseException>(ure, headers, status);
    }
}


现在,我可以取回数据,它可以在CURL和WebBrowser中使用,最重要的是,可以在我的前端客户端使用。

curl -i http://localhost:8080/api/users/test
HTTP/1.1 409
Access-Control-Allow-Origin: *
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fri, 14 Jul 2023 05:45:19 GMT

{"status":422,"messages":["Email address is invalid: john.doegmail.com", "Phone number is invalid: '2323', expecting in format '999-999-9999'", "Invalid State 'xx'. A valid US state is required."]}

qni6mghb

qni6mghb2#

无需手动设置Access-Control-Allow-Origin头。@CrossOrigin注解可用于直接在控制器或任何处理程序方法上配置CORS。

@CrossOrigin("*")
@RestControllerAdvice
public class GlobalExceptionHandler {
    // ...
}

字符串

相关问题