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 变量。
目前我有工作代码,但我在想我可以更容易地做到这一点吗?我的实现
使用jsonPath
方法从JSON中提取session
变量
然后实现使用enrichHeaders
方法
将session
变量添加到集成流消息header
然后实现将 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的前缀没有要求。
在我的程序中添加 HTTP.outboundGateway
header 最简单的方法是什么?
我想做的是:
我首先为URL
HTTP GET
http://localhost:8050/session
然后我得到 JSON
{
"session": "session8050"
}
我提取 session
变量的值并将其添加到下一个 HTTP GET
作为 session
header 变量。
目前我有工作代码,但我在想我可以更容易地做到这一点吗?我的实现
使用
jsonPath
方法从JSON中提取session
变量然后实现使用
将enrichHeaders
方法session
变量添加到集成流消息header然后实现将
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的前缀没有要求。