WSO2 ESB向标头添加前缀

时间:2013-06-11 11:21:27

标签: soap header wso2 esb

我尝试将WSO2 ESB与SAP Solution Manager Webservice一起用作端点。 为了向Webservice发送消息,我需要修改SOAP Header。 在谷歌搜索时,我发现我可以使用Enrich Mediator。但我找不到如何在标题中添加前缀的示例。

我拥有的是:

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<urn:ReadCompleteIncident>
<IncidentGuid>xxxxx</IncidentGuid>
<SystemGuid>xxx</SystemGuid>
</urn:ReadCompleteIncident>
</soapenv:Body>
</soapenv:Envelope>

但是我收到错误,因为ESB不知道前缀“urn:”。所以我必须将“xmlns:urn =”urn:sap-com:document:sap:soap:functions:mc-style“”添加到Header中以获取此信息:

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
<soapenv:Body>
<urn:ReadCompleteIncident>
<IncidentGuid>xxxxx</IncidentGuid>
<SystemGuid>xxx</SystemGuid>
</urn:ReadCompleteIncident>
</soapenv:Body>
</soapenv:Envelope>

如何使用Enrich Mediator进行此操作?还是有另一种解决方案吗?

谢谢:)

3 个答案:

答案 0 :(得分:2)

您可以使用WSO2 ESB的Header介体来满足您的要求。

<header name="Action" value="urn:ReadCompleteIncident"/>

您可以参考此链接以查找更多信息。

http://docs.wso2.org/wiki/display/ESB460/Header+Mediator

答案 1 :(得分:1)

我用Enrich Mediator解决了这个问题。例如,这是我的代理。

向ESB输入消息:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
   <soap:Header/>
   <soap:Body>
      <content>Message content</content>
   </soap:Body>
</soap:Envelope>

SAP PI所需的输入消息:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:xxxx">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:xxxx>
         <content>Message content</content>
      </urn:xxxx>
   </soapenv:Body>
</soapenv:Envelope>

解决方案:

<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="WSO2toSAP"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
         <property name="FORCE_SC_ACCEPTED"
                   value="true"
                   scope="axis2"
                   type="STRING"/>
         <log level="full"/>
         <enrich>
            <source type="body" clone="true"/>
            <target type="property" property="INPUT_MESSAGE"/>
         </enrich>
         <enrich>
            <source type="inline" clone="true">
               <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                  <soapenv:Body/>
               </soapenv:Envelope>
            </source>
            <target type="envelope"/>
         </enrich>
         <enrich>
            <source type="inline" clone="true">
               <urn:xxxx xmlns:urn="urn:xxxx"/>
            </source>
            <target type="body"/>
         </enrich>
         <enrich>
            <source type="property" clone="true" property="INPUT_MESSAGE"/>
            <target type="body" action="child"/>
         </enrich>
         <log level="full"/>
         <send>
            <endpoint key="WSO2toSAP_endpoint"/>
         </send>
      </inSequence>
   </target>
   <description/>
</proxy>

我希望,我帮助你:)。

答案 2 :(得分:0)

我认为有多种方法可以解决这个问题 -

  1. payloadFactory介体,用于处理请求或响应。​​

  2. 使用脚本介体 - 有关如何使用脚本的更多详细信息,请查看此页面http://abeykoon.blogspot.com/2013/03/encoding-and-decoding-xml-using-wso2-esb.html#comment-form。如您所见,博客使用payloadFactory生成请求,然后使用脚本对其进行操作以获得所需的效果。

  3. 如果我找时间,我会尝试使用脚本为您构建快速解决方案。

    一切顺利......