认真总结一下怎么用Java调用.net写的webservice。
【使用远程调用的方式,不生成客户端代码】
一、学会看wsdl,有以下几个需要注意的地方:
1、namespace:
2、函数的参数,包括两种类型,输入参数,输出参数。
他对应的服务端的定义是这样的:
3、函数的返回
二,写代码
利用服务地址,远程调用,不生成客户端代码。这个时候需要:设置参数(包括输入类型,输出类型),设置函数返回类型。(如果是自定义类型,还要注册自定义类型),执行函数,获取输出参数。
三,示例,对于上述接口,采用下面的代码进行调用:
但是对于自定义类型,要注意,在客户端首先需要将该类型定义成一个类,然后在调用函数前,需要进行注册。
比如下面wsdl描述的一个函数:
他在服务端的定义,是这样的:
,因此,在客户端定义类
。
那么,在客户端是这样调用webservice的该接口的:
总的来说,第二种方式比较合适。还有cxf提供的一个wsdl2java也可以根据wsdl生成客户端类
【使用本地调用的方式,wsimport生成客户端代码】
一、采用命令wsimport生成webservice客户端代码
命令为:wsimport -keep ….?wsdl
之后会生成一系列的客户端类(包括服务端的自定义类型都会生成响应的类),就像调用本地函数一样调用webservice的接口。
例如对于上述第二个接口,该怎么调用呢?
首先生成的客户端代码:
采用如下方式,调用getRunInfo接口,就与调用本地函数一样:
先生成类PTRService对象,
利用对象PTRService 生成PTRServiceSoap对象,利用PTRServiceSoap对象调用函数。
类PTRService对应wsdl中的(service)
类PTRServiceSoap对应wsdl中的(binding)
【问题】,用第二种方式的时候,会出现错误:java.lang.IllegalStateException: Could not initialize Service.
解决办法,build path中去掉xfire的包