通过前面的记录,我们知道发布一个服务之后,如果别人需要调用,则必须知道我们的wsdl地址,同理,我们要调用天气预报的接口,也必须得到该对应wsdl,下面给出比较齐全的wsdl网址,需要的可以自己去查阅:http://www.webxml.com.cn/zh_cn/web_services.aspx
今天的例子,将讲解如何调用去全国电视tv的接口
通过查阅,可以得到该wsdl地址为:
http://webservice.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx?wsdl
(一)、wsimport生成代理类
wsimport在 jax-ws使用webservice中已经介绍使用过了,这里直接使用。
创建new web项目,cmd进入项目路径
准备将所有代理类,生成到com.xj.service 这个package中
1
|
D:\workspace\HangBan\src>wsimport -p com.xj.tv -keep http: //webservice.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx?wsdl
|
使用jdk6编译报错
[WARNING] src-resolve.4.2: Error resolving component 's:schema'. It was detected
that 's:schema' is in namespace 'http://www.w3.org/2001/XMLSchema', but compone
nts from this namespace are not referenceable from schema document 'file:/E:/wor
kspace/practical/WebServiceWeather/src/com/weather/wsdl.xml#types?schema1'. If t
his is the incorrect namespace, perhaps the prefix of 's:schema' needs to be cha
nged. If this is the correct namespace, then an appropriate 'import' tag should
be added to 'file:/E:/workspace/practical/WebServiceWeather/src/com/weather/wsdl
.xml#types?schema1'.
.............
这应该是个bug
解决方法:将wsdl保存到本地,将所有的
<s:element ref="s:schema"/> 改成 <s:any minOccurs="2" maxOccurs="2"/> 并且将后面的
<s:any /> 删除。
再次执行wsimport命令,wsdl地址改为本地地址如下
wsimport -p com.xj.service -keep e:/hangban.xml
如果还是报错,就将wsdl文件里面的<wsdl:documentation 节点全部删除。应该就没问题了
生成好java文件之后 。就可以调用了。
可以看到com.xj.tv中都是通过wsimport生成的代理类,可以直接使用
上面有很多类,已经对应的response,我们要找到的是带有soap的类
(二)、客户端直接调用代理类
1
2
3
4
5
6
7
|
ChinaTVprogramWebService service = new ChinaTVprogramWebService();
ChinaTVprogramWebServiceSoap soap = service.getChinaTVprogramWebServiceSoap();
ArrayOfString arrayOfString = soap.getTVchannelString( 80 );
List<String> list = arrayOfString.getString();
for (String string:list){
System.out.println(list);
}
|
给TVchannel任意一个id,例如80,可以看到输出结果
1
|
[ 411 @莆田电视台]
|
其他调用方式类似了