使用WSO2 Integration Studio将REST API暴露为SOAP API的参数兼容问题
解决方案
方法1:使用Envelope Mediator提取SOAP Body内容
在PayloadFactory之前添加envelope mediator,直接提取SOAP Body中的内容作为新的消息负载,后续的XPath表达式就能正确匹配目标节点。
修改后的完整API配置:
<?xml version="1.0" encoding="UTF-8"?> <api context="/test" name="test" xmlns="http://ws.apache.org/ns/synapse"> <resource methods="POST"> <inSequence> <!-- 提取SOAP Body内容,移除Envelope和Body标签 --> <envelope extractBody="true"/> <payloadFactory media-type="json"> <format>{
 "_poststudent": {
 "name" : "$1",
 "school": "$2",
 "grade": $3
 }
 }</format> <args> <arg evaluator="xml" expression="//root/_poststudent/name"/> <arg evaluator="xml" expression="//root/_poststudent/school"/> <arg evaluator="xml" expression="//root/_poststudent/grade"/> </args> </payloadFactory> <call> <endpoint> <http method="post" uri-template="http://ITMTNP219BS5:8290/services/RESTDataService/student"> <suspendOnFailure> <initialDuration>-1</initialDuration> <progressionFactor>-1</progressionFactor> <maximumDuration>0</maximumDuration> </suspendOnFailure> <markForSuspension> <retriesBeforeSuspension>0</retriesBeforeSuspension> </markForSuspension> </http> </endpoint> </call> <respond/> </inSequence> <outSequence/> <faultSequence/> </resource> </api>
方法2:修改XPath表达式适配SOAP命名空间
如果不想修改消息结构,可直接调整PayloadFactory中的XPath表达式,引入SOAP命名空间并定位到Body内的节点:
修改后的PayloadFactory配置片段:
<payloadFactory media-type="json"> <format>{
 "_poststudent": {
 "name" : "$1",
 "school": "$2",
 "grade": $3
 }
 }</format> <args> <arg evaluator="xml" expression="//soap:Body/root/_poststudent/name" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/> <arg evaluator="xml" expression="//soap:Body/root/_poststudent/school" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/> <arg evaluator="xml" expression="//soap:Body/root/_poststudent/grade" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/> </args> </payloadFactory>
错误原因说明
出现INCOMPATIBLE_PARAMETERS_ERROR是因为原始请求包含SOAP Envelope和Body标签,且SOAP命名空间未被XPath表达式识别,导致//root/_poststudent/name这类表达式无法匹配到任何节点,PayloadFactory无法获取所需参数,从而抛出参数不兼容异常。
内容的提问来源于stack exchange,提问作者Oussama Nairi
相关产品推荐
相关产品推荐

