Я пытаюсь получить информацию о заголовке из контроллера запросов и прочитать ее в IntegrationFlow

#spring #spring-integration

Вопрос:

Я хотел понять, где лучше всего читать заголовки и использовать их внутри моего слоя IntegrationFlow.

ServiceController.java

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/v1/integration")
public class ServiceController {
    @Autowired
    private ServiceGateway gateway;
    
    @GetMapping(value = "info")
    public String info() {
        return gateway.info();
    }
}
 

ServiceGateway.java

 import org.springframework.integration.annotation.Gateway;
import org.springframework.integration.annotation.MessagingGateway;

@MessagingGateway
public interface ServiceGateway {
    @Gateway(requestChannel = "integration.info.gateway.channel")
    public String info();
}
 

ServiceConfig.java

 import java.net.URISyntaxException;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.integration.annotation.IntegrationComponentScan;
import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.http.dsl.Http;
import org.springframework.messaging.MessageHeaders;

@Configuration
@EnableIntegration
@IntegrationComponentScan
public class ServiceConfig {
    @Bean
    public IntegrationFlow info() throws URISyntaxException {
        String uri = "http://localhost:8081/hellos/simpler";
        return IntegrationFlows.from("integration.info.gateway.channel")
                .handle(Http.outboundGateway(uri).httpMethod(HttpMethod.POST).expectedResponseType(String.class)).get();
    }
}
 

От потребителя я получаю некоторые метаданные заголовка. Я хочу знать в приведенном выше потоке, является ли это хорошей идеей из следующих подходов:

  1. Прочитайте заголовки в контроллере, а затем перейдите в мой поток интеграции: для этого я не знаю, как пройти.
  2. Существует ли лучший или какой-либо другой способ считывания заголовков запросов на уровень IntegrationFlow?

Для этого второго подхода я попробовал приведенный ниже код, но во время выполнения я получаю ошибку, так как канал является одним из способов и, следовательно, останавливает поток.

 return IntegrationFlows.from("integration.info.gateway.channel").handle((request) -> {
            MessageHeaders headers = request.getHeaders();
            System.out.println("-----------"   headers);
        }).handle(Http.outboundGateway(uri).httpMethod(HttpMethod.POST).expectedResponseType(String.class)).get();
 

Моя проблема заключается в том, как отправить параметры запроса из входящего вызова, чтобы передать те, которые внутренне вызывают другой вызов rest. Здесь я хотел преобразовать данные из заголовков запросов и построить в новое тело json, а затем отправить это по http://localhost:8081/hellos/simpler URL.

Поток:

введите описание изображения здесь

Я пытаюсь создать это тело запроса перед отправкой во внутренний почтовый вызов REST:

введите описание изображения здесь

Ответ №1:

Метод шлюза без paylaod предназначен для получения данных, а не для их запроса.

https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-calling-no-argument-methods

Добавьте @Header в шлюз аннотированный параметр.

https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-configuration-annotations

 @MessagingGateway
public interface ServiceGateway {
    
    @Gateway(requestChannel = "integration.info.gateway.channel")
    public String info("", @Header("x-api") String xApi);

}
 

Это приведет к отправке сообщения с пустой строкой в качестве полезной нагрузки с установленным заголовком.

Комментарии:

1. Эй, @Гэри, Спасибо за вашу помощь, но мои следующие вопросы: как я могу получить эти свойства заголовка внутри метода IntegrationFlow, это делает неявным доступным или как извлечь ?

2. И от контроллера как я должен передать это значение заголовка ?

3. См . baeldung.com/spring-rest-http-headers добавьте @RequestHeader параметр для получения заголовков. Передайте заголовок, который вы хотите указать в параметре шлюза. У вас уже есть код для доступа к заголовкам сообщений в обработчике.