【问题标题】:Adding new header when retrying with Spring WebClient使用 Spring WebClient 重试时添加新标头
【发布时间】:2020-03-02 20:25:59
【问题描述】:
webclientbuilder.baseUrl(url)
                .defaultHeaders(headers -> headers.addAll(requestHeader))
                .build()
                .post()
                .uri("/uri")
                .bodyValue(data)
                .exchange()
                .flatMap(response  -> {
                                if(response.statusCode() == HttpStatus.UNAUTHORIZED){
                                                //retry with updated token in header
                                }
                })
                //return bodyToMono of specific object when retry is done or if
                //response status is 2xx

感谢任何有关如何处理此问题的建议!正如 cmets 所说,如果 statusCode 为 UNAUTHORIZED,并且如果 statusCode 为 2xx,则在重试 post 请求之前,我需要将新令牌添加到 header 中,然后返回 bodyToMono。

【问题讨论】:

    标签: spring spring-boot request-headers spring-retry spring-webclient


    【解决方案1】:

    您可以通过向网络客户端添加过滤器来解决此问题:

    public ExchangeFilterFunction retryOn401() {
        return (request, next) -> next.exchange(request)
                .flatMap((Function<ClientResponse, Mono<ClientResponse>>) clientResponse -> {
                    if (clientResponse.statusCode() == HttpStatus.UNAUTHORIZED) {
                        return authClient.getUpdatedToken() //here you get a Mono with a new & valid token
                                .map(token -> ClientRequest
                                        .from(request)
                                        .headers(headers -> headers.replace("Authorization", Collections.singletonList("Bearer " + token)))
                                        .build())
                                .flatMap(next::exchange);
                    } else {
                        return Mono.just(clientResponse);
                    }
                });
    }
    

    因此,当webclient重试未授权请求时,它可以获得一个新的token并在重试之前将其设置在header上。 确保将其添加到网络客户端:

    webclientbuilder.baseUrl(url)
                .defaultHeaders(headers -> headers.addAll(requestHeader))
                .filter(retryOn401())
                .build();
    

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 2011-11-27
      • 2021-04-20
      • 1970-01-01
      • 2021-06-13
      • 2020-03-27
      • 2023-01-09
      • 1970-01-01
      • 2020-01-17
      相关资源
      最近更新 更多