使用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吗?
答案 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>
希望这可以帮助你。