如何在WSO2 ESB 4.8.1中的SOAP标头中插入嵌套XML结构

时间:2015-06-30 06:04:42

标签: xml soap wso2 wso2esb

我有一个以下嵌套结构,我想在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:&lt;PageHeader&gt;&lt;PageId&gt;&lt;/PageId&gt;&lt;/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介体,我还想从属性中填充值。请帮忙。

2 个答案:

答案 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>

这应该可行。