在我的程序中添加 HTTP.outboundGateway
header 的最简单方法是什么?
我想做的是:
我首先为 URL
执行 HTTP GET
http://localhost:8050/session
然后我得到 JSON
{
"session": "session8050"
}
我提取 session
变量的值并将其添加到下一个 HTTP GET
作为 session
header 变量。
目前我有工作代码,但我在想我可以更容易地做到这一点吗?我的实现
使用
jsonPath
方法从 JSON 中提取session
变量然后该实现使用
enrichHeaders
方法将session
变量添加到集成流消息 header然后实现使用
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
的问题的答案。
如您所见,HeaderMapper
将 MessageHeaders
重新映射到目标协议(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/