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

标签 spring spring-integration spring-integration-dsl

在我的程序中添加 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. 然后实现使用HeaderMapper 类将session 变量添加到HTTP 调用 header

    我的实现是

    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 header 中??

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

最佳答案

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

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

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

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

.mappedRequestHeaders("session")

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

关于Spring Integration DSL : How to add the HTTP. outboundGateway header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52665066/

相关文章:

spring - @ExceptionHandler 不适用于 Spring MVC 3.1 单元测试

spring - 如何在 Spring Framework 中为 BasicDataSource 设置最大池大小或连接大小

java - 使用 stdin-channel-adapter 的 spring 集成类是什么?

java - Spring 集成 - 入站与出站 channel 适配器

java - SFTP Spring 集成的文件轮询和过滤问题

java-8 - 使用 Transformer 的值丰富 header

java - 如何在 Spring Integration 中轮询时根据主题过滤电子邮件

spring-integration - Spring Integration Java DSL : The Http. outboundGateway 与 HttpMethod.PATCH 不起作用

java - Spring MVC @ModelAttribute 不适用于用户定义的依赖项

java - Spring MVC 表单验证不适用于嵌套的复杂类型