【问题标题】:How to send REST requests with parameters in Apache Camel如何在 Apache Camel 中发送带有参数的 REST 请求
【发布时间】:2021-08-10 16:36:14
【问题描述】:

我很好奇如何在 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);
    }
}

【问题讨论】:

    标签: java rest apache-camel spring-camel camel-http


    【解决方案1】:

    您可以使用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();
    

    【讨论】:

    • 您好@pasi-Österman 感谢您的回答。在第一种情况下出现以下错误:没有类型转换器可用于从类型:org.springframework.util.LinkedCaseInsensitiveMap 转换为所需类型:java.io.InputStream with value {id=9} 整个代码:from("sql:select id from egr_status where id in (11, 9)?repeatCount=1") .log("&gt;&gt;&gt;SQL: ${body}") .split(body()) .toD("http://egr.gov.by/api/v2/egr/getRegNumByState/${body}") .setHeader(Exchange.HTTP_METHOD, constant("GET"))
    • SQL 组件默认返回结果为List&lt;Map&lt;String, Object&gt;&gt;,因此split(body()) 会将其拆分为单独的Map&lt;String, Object&gt; 实例。如果您要在 URL 中使用的值在地图中,则必须改用 .toD("http://egr.gov.by/api/v2/egr/getRegNumByState/${body[columnKey]}") 之类的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多