2012-02-02 160 views
1

我正在嘗試使用CAMEL作爲HTTP代理,並且我想從傳入的HTTP消息中提取參數與XML正文。然後,我希望將此參數添加到另一個端點(另一個服務器)的HTTP POST消息的標題中。Apache Camel:如何從傳入的HTTP消息提取參數(使用XML正文)

示例:XML主體包含一個名爲「subscriptionId」的參數。然後,此字段「subscriptionId」的值將用於傳出HTTP POST消息的URI中。

所以,如果subscriptionId = 1234567,我想在HTTP POST消息的URI是這樣的:

POST/web應用/ createnewsubscription subscriptionId = 1234567

我使用Spring DSL創建我的駱駝?路線。

任何想法如何做到這一點?

感謝,

+0

你應該接受你以前的問題的答案。這會激勵更多的人回答這個問題。 – maximdim 2012-02-02 19:27:26

+0

嗨maximdim,我沒有回覆我在我以前的問題上的答覆(「非常感謝!」等:))。我應該做更多的事情來結束這個話題嗎? – opstalj 2012-02-03 07:42:21

+0

如果您對答案感到滿意,您需要將其標記爲「已接受」 - 請參閱問題左側的複選標記。 – maximdim 2012-02-03 14:50:31

回答

2

我想你想發佈到第一URL與XML作爲有效載荷。

首先,您需要使用XPath組件獲取XML標記的值,然後使用setBody將參數傳遞給代理請求(可以選擇從POST切換到GET)。

像這樣的東西應該工作:

<route> 
    <from uri="jetty:http://127.0.0.1:8080/myapp"/> 
    <setHeader headerName="subscriptionId"> 
    <xpath resultType="java.lang.String">//subscriptionId/text()</xpath> 
    </setHeader> 
    <!-- if you need to convert from POST to GET 
    <setHeader headerName="CamelHttpMethod"> 
    <constant>GET</constant> 
    </setHeader> 
    --> 
    <setBody> 
    <simple>subscriptionId=${in.headers.subscriptionId}</simple> 
</setBody> 
    <to uri="jetty:http://127.0.0.1:8090/myapp?bridgeEndpoint=true&amp;throwExceptionOnFailure=false"/> 
</route> 

您應該能夠通過命令行測試用的wget說:

$ cat 1.txt 
<a> 
<subscriptionId>123</subscriptionId> 
</a> 

$ wget --post-file=1.txt --header="Content-Type:text/xml" http://127.0.0.1:8080/myapp 

你可以使用第二條途徑來測試像這樣的迴應:

<route> 
    <from uri="jetty:http://127.0.0.1:8090/myapp"/> 
    <to uri="log:mylog?level=INFO"/> 
    <setBody> 
    <simple>OK: ${in.headers.CamelHttpMethod}: ${in.headers.subscriptionId}</simple> 
    </setBody>  
</route> 

如果您將camelContext設置爲'trace',您應該會在您的瀏覽器中看到很多信息日誌處理的每一步發生了什麼:

<camel:camelContext id="camel" trace="true" xmlns="http://camel.apache.org/schema/spring"> 
+0

完美!正是我在找什麼。我會測試它,然後讓你知道它是如何去的。再次感謝。 – opstalj 2012-02-04 11:02:46

+0

我工作就像一個魅力:)。 – opstalj 2012-02-06 07:47:56

+0

很好用:) – maximdim 2012-02-06 15:44:05

相關問題