#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();
}
}
От потребителя я получаю некоторые метаданные заголовка. Я хочу знать в приведенном выше потоке, является ли это хорошей идеей из следующих подходов:
- Прочитайте заголовки в контроллере, а затем перейдите в мой поток интеграции: для этого я не знаю, как пройти.
- Существует ли лучший или какой-либо другой способ считывания заголовков запросов на уровень 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 предназначен для получения данных, а не для их запроса.
Добавьте @Header
в шлюз аннотированный параметр.
@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
параметр для получения заголовков. Передайте заголовок, который вы хотите указать в параметре шлюза. У вас уже есть код для доступа к заголовкам сообщений в обработчике.