互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取电子邮箱验证和查询火车时刻表和天气预报为例进行说明。
一、调用WebService验证 Email 地址是否正确
1.1、找到提供Email验证的Webservice的网络地址
http://www.webxml.com.cn/WebServices/ValidateEmailWebService.asmx访问如图所示:
找到WebService的wsdl描述,通过URL地址http://www.webxml.com.cn/WebServices/ValidateEmailWebService.asmx?wsdl:如下:
1.2、客户端编码方式访问第三方提供的webService服务
1、借助wsimport命令工具自动生成客户端代码
创建一个测试项目,如下:
打开命令行窗口,切换到项目的src目录,执行"wsimport -keep http://www.webxml.com.cn/WebServices/ValidateEmailWebService.asmx?wsdl"生成客户端代码,如下图所示:
生成的代码如下:
借助生成的代码编写请求代码
package cn.com.emailWsClient; import cn.com.webxml.ValidateEmailWebService; import cn.com.webxml.ValidateEmailWebServiceSoap; public class EmailWsClient { public static void main(String[] args) { //创建ValidateEmailWebService工厂 ValidateEmailWebService factory = new ValidateEmailWebService(); //创建ValidateEmailWebServiceSoap对象 ValidateEmailWebServiceSoap emailInfo = factory.getValidateEmailWebServiceSoap(); String email = "myl@163.com"; //调用Email验证方法 //, /** * 输入参数:EmailAddress = Email 地址(默认SMTP端口25) * 返回数据: Byte 字节。 * 返回值: * 0 = 请重新验证; * 1 = 邮件地址合法; * 2 = 只是域名正确; * 3 = 一个未知错误; * 4 = 邮件服务器没有找到; * 5 = 电子邮件地址错误; * 6 = 免费用户验证超过数量(50次/24小时); * 7 = 商业用户不能通过验证 * */ int emaileResult = emailInfo.validateEmailAddress(email); switch (emaileResult) { case 0: System.out.println("重新验证"); break; case 1: System.out.println("邮件地址合法"); break; case 2: System.out.println("只是域名正确"); break; case 3: System.out.println("一个未知错误"); break; case 4: System.out.println("邮件服务器没有找到"); break; case 5: System.out.println("电子邮件地址错误"); break; case 6: System.out.println("免费用户验证超过数量(50次/24小时)"); break; case 7: System.out.println("商业用户不能通过验证"); break; default: break; } } }
测试多个Email地址,返回值
这样,我们通过生成的Client代码调用了第三方提供的webService服务获取email是否通过验证。
二、 调用免费的web service查询国内火车时刻表
2.1、找到提供服务的Webservice的网络地址
http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx如图所示:
找到WebService的wsdl描述信息,通过URL地址http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx?wsdl:如下:
2.2、编写客户端访问调用WebService服务
1、创建客户端项目(如例1)
2、根据WebService的wsdl描述生成客户端代码
打开命令行窗口,切换到Phone_Client的src目录,执行wsimport -keep http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx?wsdl 如下图所示:
运行结果显示,使用wsimport工具直接生成客户端代码会抛异常, 无法生成客户端代码, 只是因为我们要调用的WebService是用.net写的,这个是Java调用net的webservice都有的问题,这个问题的解决办法如下:
1、将对应的wsdl文档保存到本地(Ctrl+s)
2、修改wsdl文档的部分内容:将 <s:element ref="s:schema" /><s:any /> 替换成 <s:any minOccurs="2" maxOccurs="2"/>
替换成
根据刚刚保存到本地的wsdl文件生成代码,如下图所示:
从执行结果显示,这一次可以正常生成代码了,刷新一下src目录,就可以看到生成的代码了,如下图所示:
2、借助生成的代码编写请求代码
package cn.com.TrainTimeClient; import java.util.Date; import java.util.List; import cn.com.webxml.ArrayOfString; import cn.com.webxml.GetStationNameDataSetResponse.GetStationNameDataSetResult; import cn.com.webxml.TrainTimeWebService; import cn.com.webxml.TrainTimeWebServiceSoap; /** * * @author myl * @version 2018.4.15 * 火车时刻表 WEB 服务 (第六次提速最新列车时刻表) */ public class TrinTimeClient { public static void main(String[] args) { //创建TrainTimeWebService工厂 TrainTimeWebService factory = new TrainTimeWebService(); //创建TrainTimeWebServiceSoap对象 TrainTimeWebServiceSoap trainInfo = factory.getTrainTimeWebServiceSoap(); //获得本火车时刻表Web Services的全部始发站名称 ArrayOfString trainResult = trainInfo.getStationName(); List<String> listTrain = trainResult.getString(); for(String train : listTrain){ System.out.println(train); } //获得本火车时刻表Web Services的数据库版本更新时间 String date = trainInfo.getVersionTime(); System.out.println(date); //获得本火车时刻表Web Services支持的全部站台名称和拼音缩写 DataSet GetStationNameDataSetResult dataSet = trainInfo.getStationNameDataSet(); List<Object> listds = dataSet.getAny(); for(Object ds : listds){ System.out.println(ds.toString()); } } }
返回值
这样,我们通过生成的Client代码调用了第三方提供的webService服务获取火车时刻表的一些信息。
三、调用免费的web service获取天气预报信息
3.1、找到提供天气预报信息的Webservice的网络地址
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx访问结果如下图所示:
找到WebService的wsdl描述,通过URL地址http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl:如下:
3.2、客户端编码方式访问第三方提供的webService服务
1、借助wsimport命令工具自动生成客户端代码
创建一个测试项目,如下:
打开命令行窗口,切换到项目的src目录,执行"wsimport -keep http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl"生成客户端代码,如下图所示:
运行结果显示,使用wsimport工具直接生成客户端代码会抛异常, 无法生成客户端代码, 只是因为我们要调用的WebService是用.net写的,这个是Java调用net的webservice都有的问题,这个问题的解决办法如下:
1、将对应的wsdl文档保存到本地(Ctrl+s)
2、修改wsdl文档的部分内容:将 <s:element ref="s:schema" /><s:any /> 替换成 <s:any minOccurs="2" maxOccurs="2"/>
替换成
根据刚刚保存到本地的wsdl文件生成代码,如下图所示:
从执行结果显示,这一次可以正常生成代码了,刷新一下src目录,就可以看到生成的代码了,如下图所示
2、借助生成的代码编写客户端请求代码
package cn.com.client; import java.util.List; import cn.com.webxml.ArrayOfString; import cn.com.webxml.WeatherWebService; import cn.com.webxml.WeatherWebServiceSoap; /** * * @author myl * @version 2018.4.15 * */ public class WeatherWSClient { public static void main(String[] args) { //创建WeatherWebService工厂 WeatherWebService factory = new WeatherWebService(); //创建WeatherWebServiceSoap对象 WeatherWebServiceSoap weatherInfo = factory.getWeatherWebServiceSoap(); //根据地区获取天气情况 ArrayOfString weatherResult = weatherInfo.getWeatherbyCityName("北京"); //ArrayOfString 保存转化为List对象 List<String> listWeather = weatherResult.getString(); for(String weather : listWeather){ System.out.println(weather); } } }
返回结果:
这样,我们通过生成的Client代码调用了第三方提供的webService服务获取到了南宁市的天气预报信息。