谈谈WebService开发-基础篇

上一篇我们通过源生JDK的方式尝试了调用免费的查手机归属地的webservice服务,这篇我们来尝试下采用Apache webservice开源框架CXF来开发一个客户端请求下天气预报信息。

         开发步骤:

         1.创建客户端工程:Weather-cxf-Client,下载cxf相关jar包即工具,如下图,有需要的朋友可以网上下载或小窗我;

         2.利用cxf工具wsdl2java.bat生成客户端代码,工具在如下目录,考虑到使用方便,将以下bin目录设置到系统环境变量中:

       3.查找免费的天气预报服务的wsdl地址,查找方法上篇已经提供了方法,查得如下地址:http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl

       4.进入到第1步创建的工程的src目录,执行wsdl2java -keep http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl,执行此命令会报如下图的错误:

上一篇评论中说过此问题的原因是由于此天气预报的服务器端是用net开发的,java调用net开发的webservice时会有些问题,可以用如下方法解决,现在我们来验证一下:

             A.先将生成本地的wsdl文档,浏览器访问http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl将显示的内容复制保存到一个本地文件weather.wsdl即可;

             B.将本本地文档weather.wsdl中的<s:element ref="s:schema"/><s:any /> 替换成<s:any minOccurs="2" maxOccurs="2"/>;

             C.用之前说的方法以本地wsdl文件来生成客户端调用代码,执行以及生成结果如下:

执行:


结果:

         5.编写调用测试代码:

[java]  view plain  copy
  1. package com.devins.ws.weather;  
  2.   
  3. import java.util.List;  
  4.   
  5. import cn.com.webxml.ArrayOfString;  
  6. import cn.com.webxml.WeatherWS;  
  7. import cn.com.webxml.WeatherWSSoap;  
  8.   
  9. public class WeatherQueryTest {  
  10.       
  11.     public static void main(String[] args) {  
  12.         WeatherWS factory = new WeatherWS();  
  13.         WeatherWSSoap wsSoap = factory.getWeatherWSSoap();  
  14.           
  15.         ArrayOfString weather = wsSoap.getWeather("广州"null);  
  16.         List<String> weatList = weather.getString();  
  17.         for(String temp:weatList){  
  18.             System.out.println(temp);  
  19.         }  
  20.           
  21.     }  
  22.   
  23. }  

执行结果:

[plain]  view plain  copy
  1. 广东 广州  
  2. 广州  
  3. 2350  
  4. 2015/05/08 08:54:27  
  5. 今日天气实况:气温:26℃;风向/风力:南风 3级;湿度:83%  
  6.   
  7. 太阳镜指数:热。适合穿T恤、短薄外套等夏季服装。  
  8.   
  9. 5月8日 多云  
  10. 24℃/31℃  
  11. 无持续风向微风  
  12. 1.gif  
  13. 1.gif  
  14. 5月9日 大到暴雨转大雨  
  15. 23℃/28℃  
  16. 无持续风向微风  
  17. 23.gif  
  18. 9.gif  
  19. 5月10日 多云  
  20. 23℃/28℃  
  21. 无持续风向微风  
  22. 1.gif  
  23. 1.gif  
  24. 5月11日 大到暴雨转雷阵雨  
  25. 23℃/28℃  
  26. 无持续风向微风  
  27. 23.gif  
  28. 4.gif  
  29. 5月12日 多云  
  30. 24℃/29℃  
  31. 无持续风向微风  
  32. 1.gif  
  33. 1.gif  

注意,此客户端工程调用无需引入cxf的相关jar包,引入执行上面的测试代码会报如下错误:

[plain]  view plain  copy
  1. Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: No namespace on "html" element. You must send a SOAP request.  
  2.  at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:156)  
  3.  at com.sun.proxy.$Proxy32.getWeather(Unknown Source)  
  4.  at com.devins.ws.weather.WeatherQueryTest.main(WeatherQueryTest.java:18)  
  5. Caused by: org.apache.cxf.binding.soap.SoapFault: No namespace on "html" element. You must send a SOAP request.  
  6.  at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.readVersion(ReadHeadersInterceptor.java:109)  
  7.  at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:142)  
  8.  at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:60)  
  9.  at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)  
  10.  at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:801)  
  11.  at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1679)  
  12.  at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1517)  
  13.  at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1425)  
  14.  at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)  
  15.  at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:650)  

下一篇将深入对WSDL文档进行分析与图解。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值