基于Apache Camel+Jetty组件发起GET请求获取JSON响应的问题
使用Apache Camel Jetty组件调用DWD WFS服务获取JSON响应
嘿,我看你已经有了一个不错的起步,下面帮你补全并优化这段代码,确保能成功获取目标WFS服务的JSON响应:
完整可运行代码片段
import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; public class DwdWfsRoute extends RouteBuilder { @Override public void configure() throws Exception { from("direct:dwd") // 指定要调用的HTTPS主机,通过Jetty组件发起请求 .to("jetty:https://maps.dwd.de") // 设置请求的路径部分(和你已有的代码对应) .setHeader(Exchange.HTTP_PATH, simple("/geoserver/dwd/ows")) // 补全完整的查询参数——注意这里直接用&就行,不用HTML转义的& .setHeader(Exchange.HTTP_QUERY, simple("service=WFS&version=2.11.0&request=GetFeature&typeName=dwd:RBSN_RR&outputFormat=application/json")) // 明确告诉服务我们要JSON格式的响应(可选,但能避免意外返回XML) .setHeader(Exchange.ACCEPT_CONTENT_TYPE, simple("application/json")) // 这里可以换成你需要的响应处理逻辑,比如存文件或者转发到其他系统 .log("拿到的JSON响应:${body}"); } }
几个关键注意点
- Jetty端点写法:用
jetty:https://maps.dwd.de指定目标服务的主机和协议,Camel会通过Jetty组件帮你发起HTTPS请求。 - 查询参数修正:你原来代码里的
&是HTML转义后的符号,在Camel的simple表达式里直接用普通的&就可以,不需要转义。 - 响应格式指定:添加
ACCEPT_CONTENT_TYPE头是个好习惯,能确保服务返回我们想要的JSON,而不是默认的XML格式。 - 自定义处理逻辑:最后那句
log只是示例,你可以根据需求改成to("file:/your/local/path/save.json")把响应存到本地,或者对接其他业务组件。
如何测试这个路由
如果你想快速验证,可以用这段代码触发路由:
import org.apache.camel.CamelContext; import org.apache.camel.ProducerTemplate; import org.apache.camel.impl.DefaultCamelContext; public class TestDwdRoute { public static void main(String[] args) throws Exception { CamelContext context = new DefaultCamelContext(); context.addRoutes(new DwdWfsRoute()); context.start(); // 发送空消息到direct:dwd端点,触发请求 ProducerTemplate template = context.createProducerTemplate(); String jsonResponse = template.requestBody("direct:dwd", null, String.class); System.out.println("最终响应:" + jsonResponse); context.stop(); } }
如果需要设置超时、代理这类进阶配置,还可以给Jetty端点加参数,比如jetty:https://maps.dwd.de?connectTimeout=5000&socketTimeout=10000来设置5秒连接超时和10秒读取超时。
内容的提问来源于stack exchange,提问作者Jeremy Puchta
相关产品推荐
相关产品推荐

