0

有没有办法捕获 500 错误并返回 auth/userservice 响应而不是抛出?

例如。“令牌无效”/“令牌过期” - 用户服务已经提供了正确的响应

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {

            String authHeader = exchange.getRequest().getHeaders().getFirst("Authorization");

            String[] parts = authHeader.split(" ");

            return webClientBuilder.build()
                    .post()
                    .uri("http://USER-SERVICE/user/validateToken?token=" + parts[1])
                    .retrieve()
                    .bodyToMono(UserDto.class)
                    .map(userDto -> {
                        exchange.getRequest()
                                .mutate()
                                .header("X-auth-user-id", String.valueOf(userDto.getId()));
                        return exchange;
                    }).flatMap(chain::filter);
        };
    }

在成功的身份验证中,它就像一个魅力。但是如果出现任何问题,我想从我的用户服务中获得响应。

我以前没有与 webclient 合作过……它让我发疯。

编辑:我也尝试在测试之前获得响应,但不成功。我使用了一个 Dto,它应该反映来自我的用户服务的错误响应。

     var test = webClientBuilder.build()
                    .post()
                    .uri("http://USER-SERVICE/user/validateToken?token=" + parts[1])
                    .retrieve()
                    .bodyToMono(ApiExceptionDto.class);

            var y = test.subscribe(p -> {
                System.out.println(p.getMessage());
            });

我只是得到一个

reactor.core.Exceptions$ErrorCallbackNotImplemented: org.springframework.web.reactive.function.client.WebClientResponseException$NotFound: 404 Not Found from POST http://192.168.0.69:9001/user/validateToken?token=xx
Caused by: org.springframework.web.reactive.function.client.WebClientResponseException$NotFound: 404 Not Found from POST http://192.168.0.69:9001/user/validateToken?token=xx
    at org.springframework.web.reactive.function.client.WebClientResponseException.create(WebClientResponseException.java:202) ~[spring-webflux-5.3.9.jar:5.3.9]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    |_ checkpoint ⇢ 404 from POST http://USER-SERVICE/user/validateToken?token=xx [DefaultWebClient]

预期的回应:(邮递员)

POST : http://192.168.0.69:9001/user/validateToken?token=xx
{
    "message": "The token was expected to have 3 parts, but got 1.",
    "status": "NOT_FOUND",
    "time": "Wed, 18 Aug 2021 01:05:21 GMT",
    "path": "/user/validateToken"
}
4

1 回答 1

0

猜猜我做到了。

如果有人可以提供改进,我将不胜感激。

return webClientBuilder.build()
                    .post()
                    .uri("http://USER-SERVICE/user/validateToken?token=" + parts[1])
                    .exchangeToMono(clientResponse -> {
                        if (clientResponse.statusCode().isError()) {
                            return clientResponse.bodyToMono(AuthResponseDto.class);
                        }
                        return clientResponse.bodyToMono(UserDto.class);
                    }).flatMap(dto -> {
                        if (dto.getClass() != UserDto.class) {
                            AuthResponseDto authResponseDto = (AuthResponseDto) dto;
                            // returns the response to from userservice
                            return writeResponse(exchange.getResponse(), ApiExceptionDto.builder()
                                    .message(authResponseDto.getMessage())
                                    .status(authResponseDto.getStatus())
                                    .time(Instant.now())
                                    .path(authResponseDto.getPath())
                                    .build()
                                    .getJsonAsBytes());
                        }
                        return chain.filter(exchange);
                    });
于 2021-08-18T03:35:23.680 回答