【问题标题】:Getting some httpHeader in spring webclient call在 spring webclient 调用中获取一些 httpHeader
【发布时间】:2021-07-04 06:04:17
【问题描述】:

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

在常规情况下,它非常简单,并且可以正常工作:

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

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

【问题讨论】:

  • 如果您提供MVCE,会更容易为您提供帮助。我设法弄清楚您使用哪些技术并为您提供帮助,但如果您下次这样做,您会更加关注您的问题:)

标签: java spring-boot spring-webflux spring-webclient


【解决方案1】:

您应该使用 Mono 上的方法并提供操作其内容的函数(或 lambdas),而不是尝试等待 Mono 然后处理内容。

在您的情况下,您想使用 map

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

【讨论】:

  • 谢谢,我试过了res不认识map
  • 我想应该是res.bodyToMono(InquiryChequeResponse.class).map(...
  • 对不起,我没有给bodyToMono打电话。更新
  • 谢谢,@Raniz,它确实奏效了,您认为这是正确的方法还是还有更好的选择?
猜你喜欢
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 2019-12-19
  • 2021-08-02
  • 2017-06-09
  • 2020-04-29
  • 2022-01-08
相关资源
最近更新 更多