JSON到SOAP WSO2 Api管理器xml序列

时间:2016-05-12 08:42:23

标签: json xml soap wso2 wso2-am

我想将SOAP服务发布为REST(json)API。我想要公开的服务操作在WSDL / XSD定义中有一个xml序列元素:

<xs:complexType name="hellolist">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="hellolistResponse">
    <xs:sequence>
       <xs:element name="return" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
     </xs:sequence>
</xs:complexType>

我不知道如何使用PayloadFactory将JSON数组映射到xml序列。我发现的所有示例只处理简单的json和SOAP消息,例如sample WSO2 transformation。 我想改变这个json消息:

{"hellolist":{"name":["Peter","Mary","Ann","James"]}}

给这条肥皂消息:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
 xmlns:dum="http://dummyservice2.com/">
   <soapenv:Header/>
      <soapenv:Body>
         <dum:hellolist>
           <name>Peter</name>
           <name>Mary</name>
           <name>Ann</name>
           <name>James</name>
         </dum:hellolist>
   </soapenv:Body>
</soapenv:Envelope>

3 个答案:

答案 0 :(得分:0)

您可以使用有效负载工厂介体执行此操作。它可用于转换或替换客户端和后端服务器之间的消息内容。对于您的方案,您可以配置代理服务,如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="json_to_xml_factory"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <payloadFactory media-type="xml">
            <format>
               <dum:hellolist xmlns:dum="http://dummyservice2.com/">
                  <name xmlns="">$1</name>
                  <name xmlns="">$2</name>
                  <name xmlns="">$3</name>
                  <name xmlns="">$4</name>
               </dum:hellolist>
            </format>
            <args>
               <arg evaluator="json" expression="$.hellolist.name[0]"/>
               <arg evaluator="json" expression="$.hellolist.name[1]"/>
               <arg evaluator="json" expression="$.hellolist.name[2]"/>
               <arg evaluator="json" expression="$.hellolist.name[3]"/>
            </args>
         </payloadFactory>
         <log level="full"/>
      </inSequence>
      <outSequence/>
   </target>
   <description/>
</proxy>

有关详细信息,请参阅以下链接。

https://docs.wso2.com/display/ESB490/PayloadFactory+Mediator http://christinetechtips.blogspot.com/2014/02/payload-factory-mediators-to-work-with.html http://madhukaudantha.blogspot.com/2013/05/wso2-esb-payload-mediator-tutorial.html

答案 1 :(得分:0)

如果您有非静态有效负载(您的情况),则payload-factory-mediator将不是解决方案(仅适用于静态有效负载)。您遇到问题的最佳方法是在WSO2 ESB中使用xslt mediator + enrich mediator。您可以试用此示例https://docs.wso2.com/display/ESB481/Sample+440%3A+Converting+JSON+to+XML+Using+XSLT

或者你可以使用脚本调解器,如本例中所述。https://docs.wso2.com/display/ESB481/Sample+350%3A+Introduction+to+the+Script+Mediator+Using+JavaScript。然而,这不是最受欢迎的方式。

我已经使用WSO2 ESB完成了您的转换,如上所述。但我不知道这些中介工具是否也可用于WSO2 APIM(当我搜索你的问题时,我找不到任何例子)。

答案 2 :(得分:0)

尝试下面提到的步骤

使用断言将带有断言的SoapUI中的SOAP测试服务转换为带有断言的JSON服务的步骤

  1. 复制SOAP UI项目的项目xml文件
  2. 打开复制的xml文件
  3. 在SOAP调用断言
  4. 中查找JSON中所有断言类型的格式
  5. 现在将测试步骤节点的config节点中的所有soap断言转换为上一步中找到的JSON断言配置节点格式
  6. 通过更改以下所有字段将SOAP调用请求转换为JSON调用 •添加output_format节点 •添加休息呼叫 - 服务名称 •删除没有值的节点,并将其他节点转换为JSON格式,如{“node name”:“value”}等,
  7. 在测试步骤节点类型属性中 - 它将“请求”将其更改为“httprequest”
  8. 保存文件并在SOAP UI中打开
  9. 现在您可以看到新打开的项目中的所有服务都将采用JSON格式,并且所有断言都可以在以前的SOAP调用中使用。

    还引用link,它有助于完全转换请求,包括断言

    如果没有用,请回复