当前位置: 首页 > 知识库问答 >
问题:

在spring webclient调用中获取一些httpHeader

公孙令秋
2023-03-14

在我的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个答案

越高峻
2023-03-14

与其尝试等待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;
                });
    })
 类似资料:
  • 我必须使用WebClient进行分页API调用,并最终组合所有结果。例如:个人最新1000交易详情。在一次调用中,我将在json响应(List)中获得最大100个对象。这个人最多只能得到1000条记录。 在伪代码java中,它可能看起来像这样 如何在SpringMVC中以反应式方式编写相同的内容而不阻塞? 像这样的东西???我不知道。帮助我

  • 我的问题是:我有列表对象学生包括100个对象 现在,我只想得到一些学生的年龄有名字“ABC”,“BCD”,“DEF” 所以我会这么做:

  • 当使用resttemplate向基于spring的rest服务发出post请求时,我得到以下错误

  • 我试图从Swift中的PHP脚本中获得返回的值。然而,我似乎不断地得到错误: 当调用函数时会发生错误。然而,当我一创建“answerString”就打印出来时,它就成功地打印出来了! 在这里调用函数:

  • 我想调用AZDO来获取一个测试计划,但当我尝试时,这返回了一个IOException,我不知道为什么 这是stacktrace 调试[org.apache.http.client.protocol.requestAddCookies]CookieSpec选定:默认调试[org.apache.http.client.protocol.requestAuthCache]Auth缓存未在上下文中设置调试

  • 问题内容: 如果您有两个功能,例如: 并且A呼叫B,您能知道谁在B内部呼叫B时,例如: 问题答案: 您可以使用检查模块获取所需的信息。它的堆栈方法返回帧记录列表。 对于 Python 2, 每个帧记录都是一个列表。每个记录中的第三个元素是呼叫者名称。您想要的是: def f(): … print inspect.stack()[1][3] … def g(): … f() … g() g 对于 P