5

我们想用 SOAP 代理一个 RESTful Web 服务。

REST 服务使用 GET 方法并通过查询参数接受输入。它生成类型为 application/csv 的资源。

WSO2 ESB/Synapse 是否支持这样的场景,是否有可用的示例?

示例请求

SOAP 代理请求:

<request>
  <fromDate>2012-01-01</fromDate>
  <toDate>2012-12-31</toDate>
</request>

REST 端点请求:

http://localhost/person?fromDate=2012-01-01&toDate=2012-12-31

示例响应

REST 端点响应

"Name","Age","Sex"
"Geoff","22","Male"

SOAP 代理响应

<person>
  <name>Geoff</name>
  <age>22</age>
  <sex>Male</sex>
<person>

非常感谢。

4

4 回答 4

5

如果我理解正确,您希望将 REST 服务公开为 SOAP 服务,以便 SOAP 客户端可以通过 ESB 访问您的 REST 服务?

如果是这种情况,它是可能的 :) 你应该从这些检查样本 152:http: //docs.wso2.org/wiki/display/ESB451/Proxy+Service+Samples

它将解释如何获取 SOAP 请求并将其传递到 REST 后端,然后将 REST 响应转换为 SOAP 响应。

编辑:这是有关如何执行您在评论中提出的问题的示例配置,希望它能帮助您入门:)

<proxy xmlns="http://ws.apache.org/ns/synapse" name="RESTProxy" transports="https,http" statistics="disable" trace="disable" startOnLoad="true">
   <target>
      <inSequence>

         <!-- We set the HTTP Method we want to use to make the REST request here -->
         <property name="HTTP_METHOD" value="GET" scope="axis2"/>

         <!-- This is where the magic happens, for what you want i.e. mapping SOAP "params" to REST query param's --> 
         <property name="messageType" value="application/x-www-form-urlencoded" scope="axis2"/>

         <send>
            <endpoint>
               <!-- This is the RESTful URL we are going to query, like the one in the ESB example 152 -->
               <address uri="http://localhost/person" />
            </endpoint>
         </send>

      </inSequence>

      <outSequence>
         <log level="full"/>
         <property name="messageType" value="text/xml" scope="axis2"/>
         <send/>
      </outSequence>
   </target>
   <description></description>
</proxy>

那么您向 ESB 发出的 SOAP 请求应该类似于:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
    <person>
        <fromDate>2012-01-01</fromDate>
        <toDate>2012-12-31</toDate>
    </person>
   </soapenv:Body>
</soapenv:Envelope>

希望有帮助:)

于 2012-12-23T18:38:44.340 回答
1

希望这对您理解 SOAP Client 和 REST Service 通信很有帮助

http://docs.wso2.org/display/ESB460/Using+REST+with+a+Proxy+Service#UsingRESTwithaProxyService-SOAPClientandRESTService

于 2013-11-21T03:36:57.347 回答
0

您可以使用类中介器通过 XPATH 提取 SOAP 参数。然后构建 REST URL 并将其发送回 IN 序列流。

于 2013-11-20T19:58:16.437 回答
0

1.你需要从SOAP PROXY中获取值

2.你需要将它存储在一个局部变量中

3.您需要使用查询参数将值传递给 REST SERVICE

4.您需要将来自 REST 服务的响应格式化为 SOAP 格式

SOAP 请求将是,

<request> <fromDate>2012-01-01</fromDate> <toDate>2012-12-31</toDate> </request>

您可以将 SOAP PROXY 请求中的值存储为,

<proxy xmlns="http://ws.apache.org/ns/synapse" name="RESTProxy" transports="https,http" statistics="disable" trace="disable" startOnLoad="true><target>
  <inSequence>
      <property name="fromDate" expression="//fromDate" scope="default" type="STRING"/>
      <property name="toDate" expression="//toDate" scope="default" type="STRING"/>

然后您可以通过以下方式将值传递给 REST 服务,

<send>
     <endpoint>  
           <http method="GET" uri-template="http://localhost/person?fromDate=={get-property('fromDate')}&amp;toDate={get-property('toDate')}"/>  
    </endpoint>
</send>  
</inSequence>

然后您可以使用PayloadFactory调解器格式化响应,

<outSequence>  
<payloadFactory media-type="xml">     
      <format>
               <person>
                      <Name>$1</Name>
                      <Age>$2</Age>
                      <Sex>$3</Sex>
                </person>
        </format>
                <args>
                    <arg evaluator="json" expression="$.Name"/>
                    <arg evaluator="json" expression="$.Age"/>
                    <arg evaluator="json" expression="$.Sex"/>
                </args>
 </payloadFactory>
     <send/>
  </outSequence>
   </target>
   <description/>
  </proxy>

所以代理的响应将是,

<person>
  <name>Geoff</name>
  <age>22</age>
  <sex>Male</sex>
<person>
于 2016-01-05T11:59:18.353 回答