Spring Integration DSL:如何添加HTTP.outboundGateway标头?

时间:2018-10-05 11:52:54

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

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

我想做的是:

我首先为HTTP GETURL

http://localhost:8050/session

然后我得到JSON

{
   "session": "session8050"
}

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

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

  1. 使用session方法从JSON中提取jsonPath变量
  2. 然后,实现使用session方法将enrichHeaders变量添加到集成流消息头中
  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调用?

1 个答案:

答案 0 :(得分:1)

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

您看到HeaderMapper的协定将MessageHeaders重新映射到目标协议标头表示。 payload无关紧要,因此首先需要将payload中的值映射到标题中。然后说出Http.outboundGateway()应该从MessageHeaders重新映射到HttpHeaders中。

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

如果您需要包括一些自定义标头,例如与session一起使用,则实际上可以为DefaultHttpHeaderMapper使用自定义配置,也可以仅在{{1 }}:

Http.outboundGateway()

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