理解WSDL,SOAP,REST等

时间:2013-03-09 23:16:57

标签: rest grails soap wsdl cxf

我正在尝试学习如何使用WSDL从Grails项目调用Web服务。我已经获得了WSDL和一些XML结果供参考。

我已经能够从WSDL生成Java代码,一切似乎都正常工作。

这是WSDL:http://www.restfulwebservices.net/rest/USAZipCodeService.svc?wsdl

这是XML:http://api.geonames.org/postalCodeSearch?placename=MN&username=demo

我在项目中收到此异常:

错误client.WebServiceClientFactoryImpl $ WSClientInvocationHandler - “geonames”元素上没有命名空间。 javax.xml.ws.soap.SOAPFaultException:“geonames”元素上没有命名空间。

好像是说返回的XML对SOAP无效?我错过了/误解了一些难题吗?这对我来说都很新鲜。

编辑: 我正在尝试使用名为cxf client的Grails插件:https://github.com/ctoestreich/cxf-client

在Config.groovy中配置了以下内容(这里可能有错误/遗漏?):

wsdl = "http://www.restfulwebservices.net/wcf/USAZipCodeService.svc?wsdl"
namespace = "cxf.client.postalcode"
clientInterface = "cxf.client.postalcode.IPostalCodeService" 
serviceEndpointAddress = "http://api.geonames.org/postalCodeSearch"

1 个答案:

答案 0 :(得分:1)

我猜您刚刚将http://api.geonames.org/postalCodeSearch?placename=MN&username=demo返回的XML作为参数发送到Web服务。显然,从返回的WSDL描述中,您可以看到没有名为geonames的元素,因此SOAPFaultException异常是非常公平的结果。

要修复它,您必须仔细参考WSDL描述,以确保invoke方法具有正确的参数,可以使用USAZipCodeService WSDL描述标记中定义的任何内容,例如<wsdl:operation>和{{ 1}}。

另一个问题:在你的调用者和Config.groovy中提到了2个不同的WSDL。前者是RESTful服务,后者是SOAP服务。它们使用不同的调用方法和参数,因此请确保您的代码具有一致的调用程序和参数。