Путь исходящих шлюзов Spring Integration с динамическими URL-адресами, методами HTTP и различными типами ответов - PullRequest
0 голосов
/ 30 мая 2018

Я немного разбираюсь в Spring Integration, и до сих пор я использовал исходящие адаптеры JMS и File, и теперь я хочу представить выходной адаптер HTTP для поддержки Spring REST.Пока все хорошо, я смог вызвать внешний REST API с любой другой проблемой, как показано ниже.

Spring Integration Config

<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 Ответ

0 голосов
/ 30 мая 2018

Непонятно, что вы подразумеваете под

Затем я попытался реализовать динамические методы 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 и типами ответов.

Это конфигурация для Spring Integration

<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! ##############");
...