使用Apache Camel时如何获取REST端点的逗号分隔路径参数值
Apache Camel获取逗号分隔路径参数的实现方案
服务端接收参数场景(提供该REST接口)
Camel REST组件默认会将路径模板中定义的参数自动注入到消息Header中,参数名和路径中定义的变量名完全一致,直接读取后拆分即可:
- 首先定义REST端点
rest() .get("/replaymessages/{messageids}") .to("direct:processReplayMessages");
如果你使用XML DSL,定义方式如下:
<rest> <get uri="/replaymessages/{messageids}"> <to uri="direct:processReplayMessages"/> </get> </rest>
- 路由中处理参数
获取到完整的逗号分隔字符串后,用Camel内置的tokenize方法拆分即可得到独立的ID列表:
from("direct:processReplayMessages") // 直接从Header读取路径参数,拆分后存入新Header .setHeader("splitMessageIds", simple("${header.messageids}").tokenize(",")) .process(exchange -> { // 业务逻辑中直接获取拆分后的列表 List<String> messageIdList = exchange.getIn().getHeader("splitMessageIds", List.class); // 逐个处理消息ID的逻辑 });
XML DSL的处理写法:
<route id="replayProcessRoute"> <from uri="direct:processReplayMessages"/> <setHeader name="splitMessageIds"> <simple>${header.messageids}</simple> <tokenize token=","/> </setHeader> <!-- 后续业务处理 --> </route>
客户端调用场景(调用该REST接口)
如果你是用Camel作为HTTP客户端调用该接口,直接将拼接好的逗号分隔ID串拼接到路径中即可:
from("direct:callReplayApi") // 假设已经将逗号分隔的ID串存入header.messageids .setHeader(Exchange.HTTP_PATH, simple("/replaymessages/${header.messageids}")) .to("http://localhost:8080?bridgeEndpoint=true") .log("接口响应结果:${body}");
注意事项
- 可以在拆分后增加参数校验逻辑,比如校验每个ID是否符合格式要求,过滤非法参数
- 如果ID数量过多导致URL超过HTTP协议长度限制,建议改为POST请求将ID列表放到请求体中传递
内容的提问来源于stack exchange,提问作者Mitesh Parikh
相关产品推荐
相关产品推荐

