如何在 Apache Camel 中发送带参数的 REST 请求

How to send REST requests with parameters in Apache Camel

我很好奇如何在 Apache Camel 中管理 HTTP REST 请求?

我需要遍历 ID 列表并将列表中的特定 ID 放入 HTTP GET 请求中。我将从数据库中收到此列表。 我需要向第三方服务器发送请求并管理响应 - 将其插入数据库。

循环请求中的ID参数如何规划?

@Component
    public class EgrRegistryNumbersRoute
          extends RouteBuilder {
        private final JacksonDataFormat format = new ListJacksonDataFormat(NumbersDTO.class);
        @Autowired
        DataSource dataSource;

List myList = List.of(1, 2, 3, 4, 5);
        
        @Override
        public void configure() throws Exception {
            from("timer://foo?repeatCount=1")
                  .noAutoStartup()
                  .setHeader(Exchange.HTTP_METHOD, constant("GET"))
                  .to("http://server/api/v2/getRegNumByState/**{HERE I WANT VALUE FROM THE LIST}**")
                  .unmarshal(format)
                  .routeId("NumbersRoute-route")
                  .log(">>>${body}")
                  .process(new InsertProcessor("table_name", "column"))
                  .to("jdbc:dataSource");
        }
    }

处理器:

public class InsertProcessor
      implements Processor {
    private final String tableName;
    private final String columns;
    
    public InsertProcessor(String tableName, String columns) {
        this.tableName = tableName;
        this.columns = columns;
    }
    
    @Override
    public void process(Exchange exchange) throws Exception {
        List<NumbersDTO> inputList = exchange.getIn().getBody(List.class);
        StringBuilder queryBuilder = new StringBuilder("INSERT INTO " + tableName + "(" + columns + ") values ");
        System.out.println("Input to be persisted : " + inputList);
        
        inputList.forEach(v -> {
            queryBuilder.append("(").append(v.getNgrn()).append("),");
        });
        String insertQuery = queryBuilder.toString().replaceFirst(".$","");
        System.out.println("Insert Query is : " + insertQuery);
        exchange.getIn().setBody(insertQuery);
    }
}

您可以使用 split 并在定义 http 生产者端点时将 to 切换为 toD 来实现此目的。使用 toD,您可以使用带有 URI 的简单语言。

from("direct:queryRestWithURI")
    .setBody(constant(myList))
    .split(body())
        .toD("http://server/api/v2/getRegNumByState/${body}")
        //do stuff
    .end();

如果您不想使用拆分器,您也可以使用循环来遍历列表。

from("direct:queryRestWithURI")
    .routeId("NumbersRoute-route")
    .setBody(constant(myList))
    .loop(simple("${body.size()}"))
        .setHeader("loopItem", simple("${body[${exchangeProperty.CamelLoopIndex}]}"))
        .toD("http://server/api/v2/getRegNumByState/${headers.loopItem}")
        // do stuff
    .end();