加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

谈谈WebService开发-应用篇(二)-基于CXF-天气预报

发布时间:2020-12-16 22:52:25 所属栏目:安全 来源:网络整理
导读:??????? 上一篇我们通过源生JDK的方式尝试了调用免费的查手机归属地的webservice服务,这篇我们来尝试下采用Apache webservice开源框架CXF来开发一个客户端请求下天气预报信息。 ???????? 开发步骤: ???????? 1.创建客户端工程:Weather-cxf-Client,下载cx

??????? 上一篇我们通过源生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.编写调用测试代码:

package com.devins.ws.weather;

import java.util.List;

import cn.com.webxml.ArrayOfString;
import cn.com.webxml.WeatherWS;
import cn.com.webxml.WeatherWSSoap;

public class WeatherQueryTest {
	
	public static void main(String[] args) {
		WeatherWS factory = new WeatherWS();
		WeatherWSSoap wsSoap = factory.getWeatherWSSoap();
		
		ArrayOfString weather = wsSoap.getWeather("广州",null);
		List<String> weatList = weather.getString();
		for(String temp:weatList){
			System.out.println(temp);
		}
		
	}

}

执行结果:

广东 广州
广州
2350
2015/05/08 08:54:27
今日天气实况:气温:26℃;风向/风力:南风 3级;湿度:83%

太阳镜指数:热。适合穿T恤、短薄外套等夏季服装。

5月8日 多云
24℃/31℃
无持续风向微风
1.gif
1.gif
5月9日 大到暴雨转大雨
23℃/28℃
无持续风向微风
23.gif
9.gif
5月10日 多云
23℃/28℃
无持续风向微风
1.gif
1.gif
5月11日 大到暴雨转雷阵雨
23℃/28℃
无持续风向微风
23.gif
4.gif
5月12日 多云
24℃/29℃
无持续风向微风
1.gif
1.gif

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

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: No namespace on "html" element. You must send a SOAP request.
 at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:156)
 at com.sun.proxy.$Proxy32.getWeather(Unknown Source)
 at com.devins.ws.weather.WeatherQueryTest.main(WeatherQueryTest.java:18)
Caused by: org.apache.cxf.binding.soap.SoapFault: No namespace on "html" element. You must send a SOAP request.
 at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.readVersion(ReadHeadersInterceptor.java:109)
 at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:142)
 at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:60)
 at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
 at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:801)
 at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1679)
 at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1517)
 at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1425)
 at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
 at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:650)

下一篇将深入对WSDL文档进行分析与图解。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读