我正在使用camel在一个看起来像旧接口的新后端上实现代理。较旧的API在请求正文中具有用户名/密码凭据,新的后端服务使用基本身份验证。我有一个XSL将提取un / pw,对XML数据库进行简单的查找(凭证可能不会完全映射),并将返回正确的凭据作为base64编码的字符串。我无法弄清楚如何将其设置为http身份验证标头值(例如,如何在.setHeader()调用中将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()调用中调用它。
由于
答案 0 :(得分:0)
您可以使用xpath从XML正文中获取内容,然后将其存储为标题。 http://camel.apache.org/xpath
.setHeader("foo", xpath("/foo/bar"))
诀窍是编写xpath表达式以使其有效。由于XML消息使用名称空间,因此您还需要在xpath表达式中使用它们。有关更多详细信息,请参阅该链接。
此外,您应启用流缓存,因为您将在此xpath表达式评估中读取邮件正文。
请参阅此链接的顶部有关流缓存和码头的信息:http://camel.apache.org/jetty