Apache骆驼简单的http示例

时间:2016-01-05 21:35:47

标签: java xml apache-camel

我对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)

1 个答案:

答案 0 :(得分:1)

关于java对象:

可在此处找到更多信息:http://camel.apache.org/data-format.html

  • JAXB
  • XStream的
  • BeanIO
  • 的JiBX
  • XmlBeans的

这些数据格式对于将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 (对我来说更容易)