Spring 集成 DSL:如何添加 HTTP.outboundGateway header?

Spring Integration DSL: How to add the HTTP.outboundGateway header?

在我的程序中添加 HTTP.outboundGateway header 最简单的方法是什么?

我想做的是:

我首先为URL

HTTP GET
http://localhost:8050/session

然后我得到 JSON

{
   "session": "session8050"
}

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

目前我有工作代码,但我在想我可以更容易地做到这一点吗?我的实现

  1. 使用jsonPath方法从JSON中提取session变量

  2. 然后实现使用enrichHeaders方法

    session变量添加到集成流消息header
  3. 然后实现将 session 变量添加到 HTTP 调用 header 和 HeaderMapper class

    我的实现是

    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 中提取 session 变量并将其直接添加到 HTTP headers?

为什么必须使用HeaderMapper?为什么集成流消息 header 不会随着有效负载的进行直接进入 HTTP.outboundGateway 调用?

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

如您所见,HeaderMapper 的合约将 MessageHeaders 重新映射到目标协议 header 的表示形式。 payload 没有任何意义,因此您首先需要将 payload 中的值映射到 header 中。然后说 Http.outboundGateway() 什么应该从 MessageHeaders 重新映射到 HttpHeaders

默认情况下 DefaultHttpHeaderMapper(它存在于 Http.outboundGateway() 中)仅映射适合 HTTP 请求的标准 HTTP headers。

如果您需要包含一些自定义 header,就像您的情况 session,您确实可以为 DefaultHttpHeaderMapper 使用自定义配置,或者只配置一个方便的Http.outboundGateway() 上的选项:

.mappedRequestHeaders("session")

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