我对Camel很新。我一直在尝试从http源获取数据。 这是我的代码:
from("timer://runOnce?repeatCount=1")
.to("http4://webservice.com/example.xml")
.process(new structureXML())
.to("mock:resource")
.stop();
和
class structureXML implements Processor {
public void process(Exchange httpExchange) throws Exception {
String httpres = httpExchange.getIn().getBody(String.class);
String[] lines = httpres.split("\n");
Pattern p = Pattern.compile("<Map Key='(.+)' Value='(.+)'/>");
HashMap<String, Integer> mapdata = new HashMap<String, Integer>();
for(String line : lines) {
Matcher m = p.matcher(line);
if(m.find())
mapdata.put(m.group(1), Integer.parseInt(m.group(2)));
}
httpExchange.getIn().setBody(mapdata);
}
}
这个例子是正确的,但我想知道进一步改善这种情况的可能方法(例如使用xpath等进行xml处理),我也想知道我可以在邮件中存储java对象的方法所以我可以在另一条路线中使用它(例如:direct:resource而不是mock)
答案 0 :(得分:1)
关于java对象:
可在此处找到更多信息:http://camel.apache.org/data-format.html
这些数据格式对于将XML转换为POJO非常有用。 我建议您尝试 BeanIO (详细文档,许多示例等)。
关于Xpath:
如果没有网络服务响应,很难说出任何指定的内容。
示例:
setBody().xpath("/soap:Envelope/soap:Body/s:insertResponse/s:data",
XmlNamespaces.getNamespace()).
关于您的示例:
你通常需要设置很多属性和标题(在http请求之前),所以它工作正常。例如:
setProperty(Exchange.CONTENT_TYPE).constant("application/soap+xml").
setProperty(Exchange.CONTENT_ENCODING).constant("gzip").
setProperty(Exchange.CHARSET_NAME).constant("utf-8").
setHeader(Exchange.CONTENT_TYPE).exchangeProperty(Exchange.CONTENT_TYPE).
我没有看到创建对Web服务的请求。在 velocity (http://camel.apache.org/velocity.html)的帮助下,或者使用SOAP日期格式(http://camel.apache.org/soap.html)很容易。
您可以使用码头(http://camel.apache.org/jetty.html)代替 http4 (对我来说更容易)