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

jgwigjjp  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(222)

我很好奇如何在Apache Camel中管理HTTP REST请求?
我需要遍历ID列表,并将列表中的特定ID放入HTTP GET请求中。我将从数据库接收此列表。我需要将请求发送到第三方服务器并管理响应-将其插入到DB中。
如何在循环内的请求中规划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);
    }
}
p8ekf7hl

p8ekf7hl1#

您可以使用split,并在定义您的http产生器端点时将to切换为toD来达成此目的。透过toD,您可以使用简单的语言搭配URI。

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

如果你不想使用splitter,你也可以使用loop来遍历列表。

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

相关问题