Путь к исходящим воротам Spring Integration с динамическими URL-адресами, методами HTTP и различными типами ответов
Я немного разбираюсь в Spring Integration, и до сих пор я использовал исходящие адаптеры JMS и File, и теперь я хочу представить выходной адаптер HTTP для поддержки Spring REST. Пока все хорошо, я смог вызвать внешний REST API с любой проблемой, как показано ниже.
Конфигурация Spring Integration
<int-http:outbound-gateway id="outbound.gateway"
request-channel="get.request.channel" url="https://jsonplaceholder.typicode.com/posts/1"
http-method="GET" expected-response-type="com.cst.entity.Post"
charset="UTF-8" reply-timeout="5000" reply-channel="reply.channel">
</int-http:outbound-gateway>
Вызов исходящего шлюза
public void restTest() throws Exception{
Message<?> message = MessageBuilder.withPayload().build();
getRequestChannel.send(message);
Message<?> receivedMsg = receivedChannel.receive();
Post post = (Post) receivedMsg.getPayload();
System.out.println("############## ServerMsg ##############");
System.out.println(post.toString());
System.out.println("############## Done! ##############");
}
Однако я хочу разработать среду, в которой разработчики могут вызывать любой URL-адрес REST любым методом и ожидать разные типы ответов. Я нашел способ динамической установки URL, как показано ниже, введя
<int-http:outbound-gateway id="outbound.gateway"
request-channel="get.request.channel" url="{fhirurl}"
http-method="GET" expected-response-type="com.bst.pages.crm.web.Post"
charset="UTF-8" reply-timeout="5000" reply-channel="reply.channel">
</int-http:outbound-gateway>
с
public void restTest() throws Exception{
FHIRInput input = new FHIRInput();
input.setUrl(url);
Message<?> message = MessageBuilder.withPayload(input).build();
getRequestChannel.send(message);
Message<?> receivedMsg = receivedChannel.receive();
Post post = (Post) receivedMsg.getPayload();
System.out.println("############## ServerMsg ##############");
System.out.println(post.toString());
System.out.println("############## Done! ##############");
}
Затем я попытался реализовать динамические методы HTTP с динамическими типами ответов, используя вышеуказанный метод, и он не работал, и похоже, что мы можем обрабатывать только URL, используя <int-http:uri-variable/>
,
Что было бы идеальным решением для этого. ценю твою помощь
Спасибо кет
РЕДАКТИРОВАТЬ
После следующих комментариев я смог реализовать платформу, в которой разработчики могут вызывать динамические URL-адреса на основе содержимого полезной нагрузки. ниже моя конфигурация для исходящего адаптера HTTP.
<int-http:outbound-gateway id="outbound.gateway"
request-channel="get.request.channel" url="{fhirurl}"
http-method-expression="payload.getHttpMethod()" expected-response-type-expression="payload.getResponseType()"
charset="UTF-8" reply-timeout="5000" reply-channel="reply.channel">
<int-http:uri-variable name="fhirurl" expression="payload.getUrl()"/>
</int-http:outbound-gateway>
Однако я все еще ищу способ передать тело динамического запроса в качестве параметра POST. Поскольку мы используем полезную нагрузку для переноса URL, метода http и ожидаемого типа ответа, я не могу передать тело запроса.
1 ответ
Непонятно, что вы подразумеваете под
Затем я попытался реализовать динамические методы HTTP с динамическими типами ответов, используя вышеуказанный метод, и он не работал, и похоже, что мы можем обрабатывать только URL, используя
<int-http:uri-variable/>
,
Чтобы обработать несколько типов ответов, получите их как String (JSON), а затем используйте преобразователь (и) для преобразования в типы.
EDIT1
Тип и метод ответа могут быть выражениями:
<xsd:attribute name="expected-response-type-expression" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
SpEL expression to determine the type for the expected response to which the response body should be converted
The returned value of the expression could be an instance of java.lang.Class or
java.lang.String representing a fully qualified class name.
This attribute cannot be provided if expected-response-type has a value
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="http-method-expression" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
The SpEL expression to determine HTTP method, use when executing requests with this adapter,
dynamically. This attribute cannot be provided if http-method has a value.
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
Решение
Мне удалось найти решение для простой среды, в которой мы можем позволить разработчикам вызывать разные URL-адреса отдыха с разными методами HTTP и типами ответов.
Это конфигурация для весенней интеграции
<int:channel id='reply.channel'>
<int:queue capacity='10' />
</int:channel>
<int:channel id='request.channel'/>
<int:channel id='outbound.Channel'/>
<int:gateway id="outboundGateway"
service-interface="com.bst.pm.PostGateway"
default-request-channel="outbound.Channel">
</int:gateway>
<int:object-to-json-transformer input-channel="outbound.Channel" output-channel="request.channel"/>
<int-http:outbound-gateway id="outbound.gateway"
request-channel="request.channel" url-expression="headers.bstUrl"
http-method-expression="headers.bstHttpMethod" expected-response-type-expression="headers.bstExpectedResponseType"
charset="UTF-8" reply-timeout="5000" reply-channel="reply.channel"
mapped-request-headers="bst*, HTTP_REQUEST_HEADERS">
</int-http:outbound-gateway>
и вот мой Java-код для вызова вышеуказанной системы интеграции.
@Autowired @Qualifier("reply.channel") PollableChannel receivedChannel;
@Autowired @Qualifier("request.channel") MessageChannel getRequestChannel;
@Autowired @Qualifier("outbound.Channel") MessageChannel httpOutboundGateway;
Post post = new Post();
post.setTitle("Spring INtegration Test");
post.setBody("This is a sample request body to test Spring Integration HTTP Outbound gateway");
post.setUserId(Long.valueOf(1));
Message<?> message = MessageBuilder.withPayload(post)
.setHeader("bstUrl", "https://jsonplaceholder.typicode.com/posts")
.setHeader("bstHttpMethod", "POST")
.setHeader("bstExpectedResponseType", "com.bst.pages.crm.web.Post")
.build();
httpOutboundGateway.send(message);
Message<?> receivedMsg = receivedChannel.receive();
Post post = (Post) receivedMsg.getPayload();
System.out.println("############## ServerMsg ##############");
System.out.println(o);
System.out.println("############## Done! ##############");