我正在尝试从请求控制器获取 Header 信息并读入 IntegrationFlow

I am trying to get Header info from Request Controller and read into IntegrationFlow

我想了解阅读 headers 并在我的 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();
    }
}

我收到来自消费者的一些 Header 元数据。我想知道在上面的流程中,通过以下方法是否是个好主意:

  1. 在 Controller 中读取 headers 然后传递到我的 IntegrationFlow:为此我不知道如何传递。

  2. 是否存在将请求 headers 读入 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();

我的问题是如何从传入呼叫发送请求参数以携带那些内部调用另一个休息呼叫的参数。在这里,我想将请求 headers 中的数据转换为新的 json body 然后将其发送到 http://localhost:8081/hellos/simpler URL.

流量:

我正在尝试在发送到内部 REST POST 调用之前构建此 RequestBody:

没有有效载荷的网关方法用于接收数据,而不是请求数据。

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);

}

这将发送一条消息,其中包含一个空字符串作为负载 header 集。