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

Spring集成DSL:如何添加HTTP。outboundGateway标头?

廖令
2023-03-14

添加HTTP最简单的方法是什么。我的程序中的outboundGateway头?

我想做的是:

我首先对URL执行HTTP GET

http://localhost:8050/session

然后我得到JSON

{
   "session": "session8050"
}

我提取session变量的值,并将其添加到下一个HTTP GET作为session头变量。

目前我有工作代码,但我想我可以做得更容易吗?我的实现

>

然后,该实现使用enrichHeaders方法将session变量添加到集成流消息头中

然后,该实现使用HeaderMapper类将session变量添加到HTTP调用头中

我的实现是

integrationFlowBuilder
.transform(p -> authenticationJson)
.enrichHeaders(h -> h.header("Content-Type", "application/json"))
.handle(Http.outboundGateway("http://localhost:8050/session").httpMethod(HttpMethod.POST)
        .expectedResponseType(String.class))
.enrichHeaders(
        h -> h.headerExpression("session", "#jsonPath(payload, '$.session')", true)
.handle(Http
        .outboundGateway(completeFromUrl)
        .httpMethod(HttpMethod.GET).mappedRequestHeaders("session").headerMapper(headerMapper())
        .expectedResponseType(String.class))

我的headerMapper是

@Bean
HeaderMapper headerMapper() {
    final DefaultHttpHeaderMapper headerMapper = new DefaultHttpHeaderMapper();
    final String[] headerNames = { "session" };
    headerMapper.setOutboundHeaderNames(headerNames);

    headerMapper.setUserDefinedHeaderPrefix("");
    return headerMapper;
}

是否可以从JSON中提取会话变量并将其直接添加到HTTP标头??

为什么必须使用HeaderMapper?为什么集成流消息头不能直接进入HTTP。outboundGateway在有效负载移动时调用?

共有1个答案

曾昂然
2023-03-14

首先,您需要了解Spring集成与任何其他EIP解决方案一样的主要目标是使流中的组件尽可能隔离,因此在未来,您可以添加一些中间步骤或删除这些步骤,而不会对整个解决方案和集成流中的其他组件产生重大影响。这应该是关于为什么必须使用HeaderMapper的问题的答案。

正如您看到的HeaderMapper的合约将MessageHeaders重新映射到目标协议标头表示。没有关于payload的内容,因此您需要首先将payload中的值映射到标头中。然后说Http.outboundGateway()应该从MessageHeaders重新映射到HttpHeaders中的内容。

默认情况下,DefaultHttpHeaderMapper(它位于Http.outboundGateway()中)只映射适合Http请求的标准Http头。

如果您需要包含一些自定义标头,例如在您的会话中,您确实可以为DefaultHttpHeaderMapper使用自定义配置,或者只需在Http.outboundGateway()上配置一个方便的选项:

.mappedRequestHeaders("session")

从版本5.0中不需要setUserDefedHeaderPrefix(")。它现在默认为空字符串,因为HTTP协议中的前缀中没有自定义标头的要求。

 类似资料:
  • 我正在尝试使用< code >传递一些自定义的HTTP头 我试过两种配置。第一个具有“< code > mapped-request-headers ”属性: 第二个具有“”属性,具有相对配置: 但在这两种情况下,远程应用程序加载的消息头如下: 没有我试图添加到请求消息中的“test”头的跟踪。 向 中? 事实上,标题似乎在GenericMessage中“消失”了: 我不明白为什么HTTP请求中会

  • 我尝试使用以下代码,得到了回应:状态:405方法不允许。这是我的Http请求:http://localhost:8090/services/test?name=test.代码或http请求有什么问题?

  • 我无法解决这个问题,现在已经坚持了很长时间。我是一个spring-integration-dsl的初学者,任何帮助都将非常感谢。

  • 我正在使用TestRestTemplate对我们的产品进行集成测试。 我有一个测试如下: 此特定请求需要一个标头值。有人能告诉我如何向TestRestTemplate调用添加标题吗?

  • 如何在下面的JUnit类中运行integrationFlow?目前出现了例外情况 因为整合流没有启动。 JUnit类: }

  • 我已经建立了一个简单的Spring集成流程,该流程由以下步骤组成: 然后定期轮询一个rest api 对有效载荷做一些处理 并将其置于Kafka主题上。 请遵守以下代码: 这非常有效,然而,我正在努力想出一些好的测试。 我应该如何模拟外部RESTAPI