在Camel中,如何使用XSL转换结果设置标头值?

时间:2013-04-29 14:53:04

标签: xslt apache-camel

我正在使用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()调用中调用它。

由于

1 个答案:

答案 0 :(得分:0)

您可以使用xpath从XML正文中获取内容,然后将其存储为标题。 http://camel.apache.org/xpath

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

诀窍是编写xpath表达式以使其有效。由于XML消息使用名称空间,因此您还需要在xpath表达式中使用它们。有关更多详细信息,请参阅该链接。

此外,您应启用流缓存,因为您将在此xpath表达式评估中读取邮件正文。

请参阅此链接的顶部有关流缓存和码头的信息:http://camel.apache.org/jetty