【问题标题】:JSON to SOAP WSO2 Api manager xml sequenceJSON 到 SOAP WSO2 Api 管理器 xml 序列
【发布时间】:2016-05-12 08:42:23
【问题描述】:

我想将 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 序列。我发现的所有示例都只处理像sample WSO2 transformation 这样的简单 json 和 SOAP 消息。 我想转换这个 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>

【问题讨论】:

  • 您是否还在纠结于将 JSON 数组映射到 SOAP 中?就这些吗?
  • 是的,问题是每个请求中JSON数组的长度不同。

标签: json xml soap wso2 wso2-am


【解决方案1】:

您可以使用有效负载工厂调解器来执行此操作。它可用于在客户端和后端服务器之间转换或替换消息内容。在您的情况下,您可以如下配置代理服务。

<?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

【讨论】:

  • 谢谢,但您的方法并不能解决问题。列表的长度是可变的,在一个请求中长度可以有 4 个元素,下一个请求是 8 个。&lt;xs:sequence&gt; &lt;xs:element name="return" type="xs:string" minOccurs="0" maxOccurs="unbounded"/&gt; &lt;/xs:sequence&gt;
【解决方案2】:

如果您有一个非静态负载(您的情况),payload-factory-mediator 将不是解决方案(仅适用于静态负载)。解决您的问题的最佳方法是在 WSO2 ESB 中使用 xslt 调解器 + 丰富调解器。你可以试试这个例子,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 是否也提供这些中介工具(当我搜索您的问题时,我找不到任何示例)。

【讨论】:

    【解决方案3】:

    试试下面提到的步骤

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

    1. 复制SOAP UI项目的项目xml文件
    2. 打开复制的xml文件
    3. 查找 JSON 中所有断言类型的格式,该格式在 SOAP 调用断言中是相等的
    4. 现在将测试步骤节点的配置节点中的所有soap断言转换为上一步中找到的JSON断言配置节点格式
    5. 通过更改所有字段,将 SOAP 调用请求转换为 JSON 调用,如下所示 • 添加 output_format 节点 • 添加 Rest 调用 – 服务名称 • 删除没有值的节点,并将其他的节点转换为 JSON 格式,如 {“node name” : “value”} 等,
    6. 在测试步骤节点类型属性中——将“request”改为“httprequest”
    7. 保存文件并在 SOAP UI 中打开它

    现在您可以看到新打开的项目中的所有服务都将采用 JSON 格式,并且之前在 SOAP 调用中的所有断言都将可用。

    另请参阅link,它有助于完全转换请求,包括断言

    如果没有帮助请回复

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2019-10-28
    相关资源
    最近更新 更多