2016-01-05 64 views
0

我對駱駝很新。我一直在嘗試從http源獲取數據。 這裏是我的代碼:Apache駱駝簡單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而不是模擬)

回答

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服務的請求。在速度http://camel.apache.org/velocity.html)的幫助下,或者可能使用SOAP日期格式(http://camel.apache.org/soap.html)很容易做到。

您可以使用碼頭http://camel.apache.org/jetty.html),而不是http4(對我來說更容易)

+0

非常詳細和有用的答案,非常感謝 – lkn2993