提问者:小点点

在spring webclient调用中获取一些httpHeader


在我的spring boot 2.4.1应用程序中,我使用WebClient调用一些外部rest服务。

在reqular场景中,它非常简单,正如我预期的那样工作良好:

InquiryChequeResponse  response=webClient.post()
    .uri(inquiryChequeUrl)
    .body(Mono.just(requestDto), InquiryChequeReq.class)
    .exchangeToMono(res -> {
            return res.bodyToMono(InquiryChequeResponse.class);
    }).block();

但我需要从响应头中获取一些值,如“requestTraceId”,并更新最终响应。我试着这样:

InquiryChequeResponse  response=webClient.post()
    .uri(inquiryChequeUrl)
    .body(Mono.just(requestDto), InquiryChequeReq.class)
    .exchangeToMono(res -> {
            String requestTraceId= res.headers().asHttpHeaders().getFirst("requestTraceId");
            Mono<InquiryChequeResponse> inquiryCheque= res.bodyToMono(InquiryChequeResponse.class);
            inquiryCheque.block().setRequestTraceId(requestTraceId);
            return inquiryCheque;
    }).block();

但我有以下例外:

block()/blockFirst()/blockLast() are blocking, whichis not supported in thread reactor-http-nio-2

我的问题是出了什么问题,以及如何获取特定的请求头并将其包含在最终响应中?


共1个答案

匿名用户

与其尝试等待Mono然后处理内容,不如使用Mono上的方法并提供操作其内容的函数(或lambda)。

在您的情况下,您希望使用map。

    .exchangeToMono(res -> {
            String requestTraceId = res.headers().asHttpHeaders().getFirst("requestTraceId");
            return res
                .bodyToMono(InquiryChequeResponse.class)
                .map(ic -> {
                    ic.setRequestTraceId(requestTraceId);
                    return ic;
                });
    })