WSO2 REST到SOAP传递操作参数

时间:2015-08-10 23:21:44

标签: rest soap wsdl wso2 wso2esb

使用WSO2 ESB 4.8.1,我已经配置了一个我想通过REST访问的WSDL代理。代理指向SOAP WSDL URI并启用了发布WSDL。这似乎工作正常,我可以在WSO2管理UI中看到该服务及其各种操作。同样,如果我去localhost:8280 / services /

问题是如何通过HTTP REST访问时传递特定于操作的参数?

让我们说我的FooService OperationX需要一个" p1"参数,我可以在浏览器中访问localhost:8280 / services / FooService / OperationX时直接传递吗?

我试过例如localhost:8280 / services / FooService / SomeOperation?p1 = somevalue,但总是得到验证错误,缺少必需的参数:

cvc-complex-type.2.4.b: The content of element 'axis2ns15:OperationXRequest' is not complete. One of '{"somenamespace":p1}' is expected.

基本的WSDL代理可以支持吗?或者我需要使用API​​吗?

1 个答案:

答案 0 :(得分:0)

我认为您的方案的更好选择是使用api通过REST访问。在这里,我创建了一个api(我使用http://jsonplaceholder.typicode.com/comments作为我的REST后端),它获取了在REST请求(http://172.22.99.96:8290/test/comments?postId=1)中发送的查询参数(postId),并将该值分配给名为mypostId的属性在api里面。 然后我通过使用有效负载工厂中介添加mypostId属性修改有效负载,该属性将与echo服务请求匹配(我已将echo服务用作SOAP后端)。 然后我通过添加“xmlns:echo =”http://echo.services.core.carbon.wso2.org“”名称空间,使用rich mediator来更改我的soap信封以匹配echo服务请求soap信封。最后,我将创建的请求发送到echo服务代理。

<api xmlns="http://ws.apache.org/ns/synapse" name="test" context="/test">
   <resource methods="GET" uri-template="/comments?postId={postId}">
      <inSequence>
         <log level="custom">
            <property name="Message Flow" value="--- Order GET ---"></property>
         </log>
         <log level="custom">
            <property name="postId" expression="$url:postId"></property>
         </log>
         <property name="mypostId" expression="$url:postId"></property>
         <call>
            <endpoint>
               <http method="GET" uri-template="http://jsonplaceholder.typicode.com/comments?postId={uri.var.postId}"></http>
            </endpoint>
         </call>
         <payloadFactory media-type="xml">
            <format>
               <echo:echoInt xmlns:echo="http://echo.services.core.carbon.wso2.org">
                  <in>$1</in>
               </echo:echoInt>
            </format>
            <args>
               <arg evaluator="xml" expression="get-property('mypostId')"></arg>
            </args>
         </payloadFactory>
         <log level="full"></log>
         <log level="custom">
            <property name="Message Flow" value="--- After Palyload factory---"></property>
         </log>
         <property name="extarctedBody" expression="$body"></property>
         <log level="custom">
            <property name="MyextarctedBody" expression="get-property('extarctedBody')"></property>
         </log>
         <log level="full"></log>
         <enrich>
            <source type="inline" clone="true">
               <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:echo="http://echo.services.core.carbon.wso2.org"></soapenv:Envelope>
            </source>
            <target type="envelope"></target>
         </enrich>
         <log level="custom">
            <property name="Message Flow" value="--- Order GET2 ---"></property>
         </log>
         <log level="full"></log>
         <enrich>
            <source type="property" clone="true" property="extarctedBody"></source>
            <target xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:echo="http://echo.services.core.carbon.wso2.org" action="child" xpath="//soapenv:Envelope"></target>
         </enrich>
         <log level="full"></log>
         <send>
            <endpoint>
               <address uri="http://localhost:8290/services/echo"></address>
            </endpoint>
         </send>
      </inSequence>
      <outSequence>
         <send></send>
      </outSequence>
   </resource>
</api>

希望这可以帮助你。