WebService调用天气接口及手机号查询归属地接口

Webservice手机号查询接口的调用

1 在这里我讲述,如何使用wsdl2命令生成客户端代码.
因为使用jdk自带的也可以,就是很烦.因为会生成.class字节码文件与.java文件在一个文件夹下,个人很不友好.但是不用配置cxf环境变量
2:小伙伴若是想使用jdk提供的命令,生成客户端也行.命令如下:
wsimport -s . -p com.ws.client http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

下面讲述使用cxf命令生成客户端代码

wsdl2java -p com.itmck.api.phone -d .http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

注意使用以上命令需要配置环境变量
在这里插入图片描述
先下载cxf相关依赖包,在配置如上环境变量,即可.
http://cxf.apache.org/download.html 随便下载一个版本就行了,不必深究于此

cmd中命令截图如下

在这里插入图片描述

两种方式调用均可以.其中cxf整合spring boot相关依赖如下:

第一种与第二种使用cxf来调用,需要引入cxf相关依赖

<!--spring boot整合CXF发布webService服务 -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
		</dependency>

代码如下调用如下

@RestController
public class WsActionController {

	// wsdl说明书地址
	private static final String WSDL_ADDRESS = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";

	/**
	 * 	方式一;需要引入cxf相关依赖 需要写个接口(这个接口和服务端一样,要根据wsdl写.很麻烦 干脆直接生成客户端代码.省的报错.)
	 * @param str
	 * @return
	 */
	@RequestMapping(value = "ws/{str}")
	public String xmlToObjs2(@PathVariable("str") String str) {

		// 1:创建代理工厂
		JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
		// 2:设置代理地址
		jaxWsProxyFactoryBean.setAddress(WSDL_ADDRESS);
		// 3:创建一个接口代理实现
		MobileCodeWSSoap create = jaxWsProxyFactoryBean.create(MobileCodeWSSoap.class);
		// 4:调用方法获取相关信息
		String mobileCodeInfo = create.getMobileCodeInfo(str, null);
		return mobileCodeInfo;
	}
	
	/**
	 * 
	 * 方式二:这种方式是不需要生成客户端代码,也不需要写接口
	 * 
	 * @param str
	 * @return
	 */
	@RequestMapping(value = "wp/{str}")
	public Object xmlToObjs(@PathVariable("str") String str) {

		// 创建动态客户端
		JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
		Client client = dcf.createClient(WSDL_ADDRESS);
		// 需要密码的情况需要加上用户名和密码
		// client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,
		// PASS_WORD));
		Object[] objects = new Object[0];
		try {
			// invoke("方法名",参数1,参数2,参数3....);
			objects = client.invoke("getMobileCodeInfo", str,null);
			return objects[0].toString();
		} catch (java.lang.Exception e) {
			e.printStackTrace();
		}

		return null;
	}

	/**
	 * 
	 * 	方式三:直接调用不需要引入cxf相关依赖.仅仅需要生成客户端代码
	 * @param str
	 * @return
	 */
	@RequestMapping(value = "gs/{str}")
	public String getPinfo(@PathVariable("str") String str) {
		// 1:创建服务视图
		MobileCodeWS mobileCodeWS = new MobileCodeWS();
		// 2:获取服务实现类
		MobileCodeWSSoap port = mobileCodeWS.getPort(MobileCodeWSSoap.class);
		// 3:通过查询方法获取信息
		String mobileCodeInfo = port.getMobileCodeInfo(str, null);
		return mobileCodeInfo;
	}

}

测试如下:
在这里插入图片描述

关于调用天气接口如下

同样使用以上命令生成时会报错:
在这里插入图片描述
这时候需要将wsdl说明书保存到本地中,然后打开xml,删除s:schama节点.再次生成即可

此时再使用上述其中一种调用方法即可,代码如下:在这里,我使用其中一种

	@RequestMapping("gw/{address}")
	public Object getWeather(@PathVariable("address") String address) {

		// 创建服务视图,视图是从service标签的name属性获取
		WeatherWS weatherWS = new WeatherWS();
		// 根据 服务视图 获取 服务实现类,实现类从portType的name属性获取
		WeatherWSSoap port = weatherWS.getPort(WeatherWSSoap.class);
		// 获取查询方法,从portType的operation标签获取
		ArrayOfString weather = port.getWeather(address, null);// 返回所有数据
		// 获取list集合遍历可以获取相应的内容
//		List<String> string = weather.getString();// 特定数据
//		String string2 = string.get(4);
		return weather;
	}

注意:

说到这里,讲述一下,会出现的几种坑
1:我们在本地生成客户端代码后,不能删除我们本地保存的wsdl使用说明书,否则报错找不到root
这是因为代码:在这里插入图片描述
此时我们应该将上面标记的两处内容 修改成服务器端wsdl说明书的路径
在这里插入图片描述
2:只有修改成上面的样子才能删除本地wsdl说明书,不报错.
3:使用 cxf对应的调用方式可能报错.比较步骤1修改即可
3:上述调用要连接网络,有些人说报错,什么的,可能是因为你电脑没连接网络.
测试如下:
在这里插入图片描述

1:这里一篇文章可以借鉴 https://blog.csdn.net/qq_26545305/article/details/80559515
本文也参考这篇文章
2:有兴趣可以交流,传统maven到spring boot真香定理 https://blog.csdn.net/ajax_mck/article/details/86677953

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值