WSO2 REST 到 SOAP 传递操作参数
WSO2 REST to SOAP passing operation parameters
使用 WSO2 ESB 4.8.1,我配置了一个 WSDL 代理,我想通过 REST 访问它。代理指向 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?
我认为您的方案更好的选择是使用 api 通过 REST 进行访问。在这里,我创建了一个 api(我使用了 http://jsonplaceholder.typicode.com/comments as my REST back end) which gets the query parameter(postId) which was sent in REST request (http://172.22.99.96:8290/test/comments?postId=1)并将该值分配给 api 中名为 mypostId 的 属性。
然后我通过使用有效负载工厂中介添加 mypostId 属性 来修改有效负载,它将匹配回显服务请求(我使用回显服务作为 SOAP 后端)。
然后我使用 enrich mediator 通过添加 "xmlns:echo="http://echo.services.core.carbon.wso2.org"" name space 来更改我的 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></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>
希望这对您有所帮助。
使用 WSO2 ESB 4.8.1,我配置了一个 WSDL 代理,我想通过 REST 访问它。代理指向 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?
我认为您的方案更好的选择是使用 api 通过 REST 进行访问。在这里,我创建了一个 api(我使用了 http://jsonplaceholder.typicode.com/comments as my REST back end) which gets the query parameter(postId) which was sent in REST request (http://172.22.99.96:8290/test/comments?postId=1)并将该值分配给 api 中名为 mypostId 的 属性。 然后我通过使用有效负载工厂中介添加 mypostId 属性 来修改有效负载,它将匹配回显服务请求(我使用回显服务作为 SOAP 后端)。 然后我使用 enrich mediator 通过添加 "xmlns:echo="http://echo.services.core.carbon.wso2.org"" name space 来更改我的 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></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>
希望这对您有所帮助。