【问题标题】:Spring Integration DSL: How to add the HTTP.outboundGateway header?Spring Integration DSL:如何添加 HTTP.outboundGateway 标头?
【发布时间】:2019-03-10 22:17:24
【问题描述】:

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

我想做的是:

我首先为URLHTTP GET

http://localhost:8050/session

然后我得到 JSON

{
   "session": "session8050"
}

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

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

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

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

  3. 然后实现将session变量添加到带有HeaderMapper类的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 调用作为有效负载?

【问题讨论】:

    标签: spring spring-integration spring-integration-dsl


    【解决方案1】:

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

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

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

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

    .mappedRequestHeaders("session")
    

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

    【讨论】:

    • 谢谢!这提供了有关该模型的更多背景信息。
    猜你喜欢
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多