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