上一篇我们通过源生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. import java.util.List;
  3. import cn.com.webxml.ArrayOfString;
  4. import cn.com.webxml.WeatherWS;
  5. import cn.com.webxml.WeatherWSSoap;
  6. public class WeatherQueryTest {
  7. public static void main(String[] args) {
  8. WeatherWS factory = new WeatherWS();
  9. WeatherWSSoap wsSoap = factory.getWeatherWSSoap();
  10. ArrayOfString weather = wsSoap.getWeather("广州", null);
  11. List<String> weatList = weather.getString();
  12. for(String temp:weatList){
  13. System.out.println(temp);
  14. }
  15. }
  16. }

执行结果:

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

谈谈WebService开发-基础篇相关推荐

  1. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-通过SQL实现特殊业务...

    前面的四篇文章演示ORM的一些常规操作与配置,通过前面的文章,应用开发人员要可以使用ORM开发出简单的应用,但是,ORM也不是万能钥匙,在业务应用中,还有很多是ORM解决不了的问题,对于这些问题,我们 ...

  2. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM中的查询

    前文回顾 前面的文章一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的基本操作一文给大家介绍了如果使用ORM实现数据的读取.插入.更新与删除基本业务也讲解了ORM开发基 ...

  3. 【学习记录】第一章 数据库设计-《SQL Server数据库设计和开发基础篇视频课程》...

    一.课程笔记 1.1  软件开发周期 (1)需求分析阶段 分析客户的业务和数据处理需求. (2)概要设计阶段 设计数据库的E-R模型图,确认需求信息的正确和完整. /* E-R图:实体-关系图(Ent ...

  4. 数据库应用程序开发基础篇—— .NET中SQL Server数据库的操作C#篇之一

    数据库应用程序开发基础篇-- .NET中SQL Server数据库的操作C#篇之一 写在前面:前面介绍了数据库系统的基本概念,SQl语句基本使用方法,接下来通过学习具体语言和具体数据库结合的应用开发来 ...

  5. Android App开发基础篇—数据存储(SQLite数据库)

    Android App开发基础篇-数据存储(SQLite数据库) 前言:Android中提供了对SQLite数据库的支持.开发人员可以在应用中创建和操作自己的数据库来存储数据,并对数据进行操作. 一. ...

  6. TensorFlow2.4 开发 基础篇① 张量和变量 (1)

         TensorFlow2.4 开发 基础篇① 张量和变量(Tensor) 文章会不断更新,喜欢的小伙伴可以帮博主点个赞哟("'▽'") 文章目录 前言 1. 变量 1.1 ...

  7. Cocos2d-Lua手游开发基础篇-何韬-专题视频课程

    Cocos2d-Lua手游开发基础篇-62875人已学习 课程介绍         Cocos2d-Lua是一个开源的移动游戏框架,可以轻松运行在iOS.Android.Blackberry等操作系统 ...

  8. Node.js后端开发 - 基础篇 #18 nodemon工具

    文章目录 前言 nodemon工具简单介绍 nodemon工具安装 nodemon工具使用(node app.nodemon app) nodemon工具使用(npm run start) 前言 上篇 ...

  9. Unity3d 开发-基础篇

    最近转向U3D开发,在公司内部范围内做的U3D开发讲座的基础篇,放在这里和大家分享,以备以后自己查询 这些是能让程序和美术形成战斗力的最基本的概念,高级话题会在后面补上 1(编辑器基本概念与工作流程) ...

  10. 1-STM32+W5500+GPRS物联网开发基础篇-工控板简介

    最近这些日子都在忙活STM+W5500+GPRS的板子,所以前面的那块板子的教程耽搁了些时间. 这次的板子和上一版相比更贴近了使用,是因为有朋友督促我要做一块直接可以在工厂使用的板子,所以设计了这一块 ...

最新文章

  1. Windows Phone开发(16):样式和控件模板
  2. jQuery中的$el是什么意思
  3. 004-CSS3动画类
  4. Hibernate框架--学习笔记(中):一对多配置、多对多配置
  5. 多项式幂函数(加强版)
  6. 利用JS实现点击上一周或下一周却换
  7. 牛客题霸 [二叉树的最大深度]C++题解/答案
  8. keras.metrics中的accuracy
  9. python 多线程读写文件_Python多线程同步---文件读写控制方法
  10. Tomcat—logs文件夹中不再产生日志文件
  11. 学习笔记 卷积网络-dropout
  12. 在博客中添加动漫美女的js
  13. echart4.0 map支持dataset实例
  14. 面试题总结:volatile的功能
  15. JAVA 用enum 来枚举java项目中的错误信息
  16. Service ‘MongoDB Server‘(MongoDB) failed to start.Verify that you have sufficient privileges to
  17. 模仿,类比,移植技法(创新技法5)
  18. Stm8L系列单片机的低功耗
  19. 计算机语言解释方法,close
  20. Nginx https 协议配置 ssl_protocols 的相关问题

热门文章

  1. 坚持学英语 -- 公司前台MM 一日英语小记
  2. php 英文替换中文,php如何中英文符号替换?
  3. 记在2019,winter is coming
  4. Windows10与Ubuntu双系统安装记录
  5. Ubuntu 18.04 桌面卡死
  6. 职场001 什么时候跳槽
  7. 使用七牛云存储解决app部署问题,免申请https认证
  8. 一文搞懂H264量化原理以及计算过程
  9. AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境
  10. 精挑细选的良心APP,每款都非常惊艳