我有一个以下嵌套结构,我想在soap标题中插入,我正在使用标题介体。
需要在Soap Header中插入的XML:
public authenticate(username:string, password:string): ng.IPromise<Object>{
var authHeader = NgJwtAuthService.getAuthHeader(username, password);
var requestConfig:ng.IRequestConfig = {
method: 'GET',
url: this.getLoginEndpoint(),
headers: {
Authorization : authHeader
},
responseType: 'json'
};
return this.$http(requestConfig);
}
我想从名为“SavedPageId”的属性中动态选择“PageId”值。
标头调解员代码:
<res:PageHeader xmlns:res="http://example.com">
<res:PageId>32332323</res:PageId>
</res:PageHeader>
结果:
<header xmlns:res="http://example.com" name="res:<PageHeader><PageId></PageId></PageHeader" scope="default" expression="get-property('SavedPageId')"/>
预期结果:
<soapenv:Header>
<res:<PageHeader>
<PageId></PageId>
</PageHeader xmlns:res="http://example.com">232323232</res:<PageHeader>
<PageId></PageId>
</PageHeader>
</soapenv:Header>
我应该如何为这个嵌套的xml结构配置我的Header介体,我还想从属性中填充值。请帮忙。
答案 0 :(得分:1)
我可以告诉你,你需要在标题中使用xpath,如:
<header xmlns:res="http://example.com" name="res:PageHeader" scope="default" expression="//xpath/for/SavedPageId"/>
否则,请尝试使用payloadFactory构建消息:
<property name="soapBody"
expression="//soapenv:Body/*"
scope="default"
type="STRING"/>
<payloadFactory media-type="xml">
<format>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<res:PageHeader xmlns:res="http://example.com">
<res:PageId>$1</res:PageId>
</res:PageHeader>
</soapenv:Header>
<soapenv:Body>
$2
</soapenv:Body>
</soapenv:Envelope>
</format>
<args>
<arg evaluator="xml" expression="get-property('SavedPageId')"/> <!-- Can also use : expression="$ctx:SavedPageId" -->
<arg evaluator="xml" expression="get-property('soapBody')"/>
</args>
</payloadFactory>
答案 1 :(得分:1)
首先,您需要将动态值保存到属性中。 然后使用以下代码:
<header scope="default">
<res:PageHeader xmlns:res="http://example.com">
<res:PageId/>
</res:PageHeader>
</header>
<enrich>
<source type="property" property="saveValueInProperty"/>
<target xmlns:res="http://example.com" action="child" xpath="$header/res:PageHeader/res:PageID/text()"/>
</enrich>
这应该可行。