Spring Integration:在http出站网关中发送json作为请求主体和头



我想用JSON负载调用一个外部REST端点POST请求,该请求将通过http入站网关从另一个服务调用。

我的应用程序使用以下配置:

<int:channel id="xappSearchRequest" />
<int:channel id="xappSearchResponse" />
<int:channel id="xappFilterChannelOutput"/>
<int:channel id="discardFilterChannel"/>
<int:channel id="mutableMessageChannel"/>
<int:filter  input-channel="mutableMessageChannel" output-channel="xappFilterChannelOutput" discard-channel="discardFilterChannel" ref="structureValidationFilter"/>
<int:transformer input-channel="xappSearchRequest" output-channel="mutableMessageChannel"
ref="mutableMessageTransformer" />

<int-http:inbound-gateway id="inboundxappSearchRequestGateway"
supported-methods="POST"
request-channel="xappSearchRequest"
reply-channel="xappSearchResponse"
mapped-response-headers="Return-Status, Return-Status-Msg, HTTP_RESPONSE_HEADERS"
path="${xapp.request.path}"
reply-timeout="50000"
request-payload-type="standalone.CFIRequestBody">
</int-http:inbound-gateway>
<int:service-activator id="xappServiceActivator"
input-channel="xappFilterChannelOutput"
output-channel="xappSearchResponse"
ref="xappSearchService"
method="handlexappRequest"
requires-reply="true"
send-timeout="60000"/>

<int:service-activator id="dicardPayloadServiceActivator"
input-channel="discardFilterChannel"
output-channel="xappSearchResponse"
ref="invalidPayloadService"
method="getInvalidMessage"
requires-reply="true"
send-timeout="60000"/>

<int-http:outbound-gateway id="get.outbound.gateway"
request-channel="get_send_channel" url="${cms.stub.request.url}"
http-method="POST" reply-channel="get_receive_channel"
expected-response-type="standalone.StubResponseBody">
</int-http:outbound-gateway>

无法弄清楚如何发送JSON负载和自定义标头来调用POST端点。

可以使用适当的属性mapped-request-headers将自定义标头映射到HTTP标头。

关于此事,有一份完整的文件:https://docs.spring.io/spring-integration/docs/5.2.3.RELEASE/reference/html/http.html#http-标头映射

对于JSON请求,<int-http:outbound-gateway>提供了RestTemplate,如果类路径上有jackson-databind,则配置了MappingJackson2HttpMessageConverter。应用程序只需要发送一个POJO,该POJO可以序列化为JSON,重要的是发送一个具有application/json值的MessageHeaders.CONTENT_TYPE头。

想明白了。我使用的出站网关如下:

<int-http:outbound-gateway id="get.outbound.gateway"
request-channel="postCmsChannel" url="${cms.stub.request.url}"
http-method="POST" reply-channel="zappSearchResponse"
expected-response-type="standalone.StubResponseBody">
</int-http:outbound-gateway> 

"postCmsChannel"是服务激活器的输出通道:

<int:service-activator id="zappServiceActivator"
input-channel="xappFilterChannelOutput"
output-channel="postCmsChannel"
ref="xappSearchService"
method="handleXappRequest"
send-timeout="60000"/>

"xappSearchService"如下所示:

@Autowired
@Qualifier("postCmsChannel")
MessageChannel postCmsChannel;
public void handleXappRequest(Message<CFIRequestBody> inMessage){

/*
* Map<String, Object> responseHeaderMap = new HashMap<String, Object>();
* 
* //MessageHeaders headers = inMessage.getHeaders(); StubResponseBody
* info=inMessage.getPayload();
* 
* setReturnStatusAndMessage(responseHeaderMap); Message<StubResponseBody>
* message = new GenericMessage<StubResponseBody>(info, responseHeaderMap);
* return message;
*/
inMessage.getHeaders();
Map<String,String> headerMap=new HashMap<String,String>();
headerMap.put("X-JWS-SIGNATURE", "dshdgshdgasshgdywtwtqsabh232wgd7wdyt");
headerMap.put("X-PARTICIPANT-ID", "CMDRV2112BB");
postCmsChannel.send(MessageBuilder.withPayload(inMessage.getPayload())
.copyHeadersIfAbsent(inMessage.getHeaders()).copyHeadersIfAbsent(headerMap).build());
}
}

最新更新