2013-04-29 45 views
0

我正在使用camel在一個看起來像一箇舊接口的新後端實現代理。較舊的API在請求正文中具有用戶名/密碼憑據,並且新的後端服務使用基本身份驗證。我有一個將抽取un/pw的XSL,對XML數據庫進行簡單的查找(憑據可能不會完全映射),並將以base64編碼的字符串形式返回正確的憑據。我無法弄清楚如何將其設置爲http Authentication標頭值(例如,如何在.setHeader()調用中將XSL轉換處理爲表達式)。在Camel中,如何設置XSL轉換結果的標題值?

我有一個看起來像這樣的SOAP請求:

<soapenv:Envelope> 
<soapenv:Body> 
    <XService> 
     <_Header username="demo" password="demo"/> 
     <_Body> 
      <_RequestParameters xsi:type="RequestServiceReport"> 
      ... 
      </_RequestParameters> 
     </_Body> 
    </XService> 
</soapenv:Body> 

和我的路線(使用Java DSL)看起來有點像這樣:

from("jetty:http://161.228.88.168:8080/sap2rjm") 
.choice() 
.when().simple("${header.channel}") 
    ... 
.when().simple("${in.header.emx} == 'authenticate'") 
    ... 
    .endChoice() 
// If the request is for a report, route it to the new service 
.when().xpath("//_RequestParameters[@type='RequestServiceReport']") 
    // TODO: How to get header from the body of the message and set as the header value? 
    // Stylesheet transform_credentials will extract username/password from body, transform 
    // for the new service (dev.reportjam) and will base4 encode to produce a string like this one... 
    .setHeader("Authorization", constant("Basic ZGVtbzpkZW1v")) 
    .to("xslt:transform_request.xsl") 
    .to("http://dev.reportjam.com/services/ReportMix?bridgeEndpoint=true") 
    .to("xslt:transform_response.xsl") 
    .removeHeaders("*") 
    .endChoice() 

.otherwise() 
    ... 
    .endChoice() 
.end(); 

我有另一個樣式表它會處理soap請求,提取un/pw,應用一些邏輯來轉換它,然後base64編碼它,但我不知道如何在上面的setHeader()調用中調用它。

感謝

+1

請出示你所擁有的一些代碼或相似。你使用什麼組件?很難弄清楚你真正想從這個問題中得到什麼。 – 2013-04-29 18:40:34

回答

0

您可以使用XPath從XML身上搶東西,然後保存,作爲一個頭。 http://camel.apache.org/xpath

.setHeader("foo", xpath("/foo/bar")) 

訣竅是寫XPath表達式所以它的工作原理。由於您的XML消息使用命名空間,因此您還需要在xpath表達式中使用它們。查看該鏈接瞭解更多詳情。

此外,您應該啓用流緩存,因爲您將讀取消息正文作爲此xpath表達式評估的一部分。

查看關於流緩存和碼頭這條鏈路的頂部:http://camel.apache.org/jetty

+0

謝謝克勞斯,但xpath將不會做我所需要的 - 我需要在正文上處理樣式表以生成標題值。 – user1814693 2013-05-08 11:24:01