调用第三方提供的webService服务

本文介绍如何调用免费的WebService服务获取天气预报信息和查询国内手机号码归属地,包括找到WebService地址、生成客户端代码及编写请求代码。

  互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为例进行说明。

  气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server), 而各大站点的应用就去调用它们得到天气信息并以不同的样式去展示(WebService Client).

一、 调用免费的web service获取天气预报信息

1.1、找到提供天气预报信息的Webservice的网络地址

  http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx 访问结果如下图所示:

  

  找到WebService的wsdl描述,通过URL地址http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl:如下:

  

1.2、客户端编码方式访问第三方提供的webService服务

  1、借助wsimport命令工具自动生成客户端代码

  创建一个测试项目,如下:

  

  打开命令行窗口,切换到项目的src目录,执行"wsimport -keep http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl"生成客户端代码,如下图所示:

  

  运行结果显示,使用wsimport工具直接生成客户端代码会抛异常, 无法生成客户端代码, 只是因为我们要调用的WebService是用.net写的,这个是Java调用net的webservice都有的问题,这个问题的解决办法如下:

  1. 将对应的wsdl文档保存到本地

  

  2、修改wsdl文档的部分内容: <s:element ref="s:schema" /><s:any /> 替换成 <s:any minOccurs="2" maxOccurs="2"/>

  

  再次执行wsimport生成代码,这次使用保存在本地的WeatherWS.wsdl文件来进行生成,如下图所示:

  

  从执行结果显示,这一次可以正常生成代码了,刷新一下src目录,就可以看到生成的代码了,如下图所示:

  

2、借助生成的代码编写请求代码

复制代码
 1 package me.gacl.ws.client;
 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 WeatherWSClient {
10 
11     public static void main(String[] args) {
12         //创建一个WeatherWS工厂
13         WeatherWS factory = new WeatherWS();
14         //根据工厂创建一个WeatherWSSoap对象
15         WeatherWSSoap weatherWSSoap = factory.getWeatherWSSoap();
16         //调用WebService提供的getWeather方法获取南宁市的天气预报情况
17         ArrayOfString weatherInfo = weatherWSSoap.getWeather("南宁", null);
18         List<String> lstWeatherInfo = weatherInfo.getString();
19         //遍历天气预报信息
20         for (String string : lstWeatherInfo) {
21             System.out.println(string);
22             System.out.println("------------------------");
23         }
24     }
25 }
复制代码

  访问结果如下:

复制代码
广西 南宁
------------------------
南宁
------------------------
2391
------------------------
2015/01/29 19:00:49
------------------------
今日天气实况:暂无实况
------------------------
空气质量:暂无;紫外线强度:最弱
------------------------
太阳镜指数:不需要。白天光线弱不需要佩戴太阳镜。
穿衣指数:较舒适。建议穿薄外套或牛仔裤等服装。
旅游指数:适宜。温度适宜,可尽情享受大自然风光。
运动指数:较适宜。较适宜进行各种户内外运动。
洗车指数:不宜。有雨,雨水和泥水会弄脏爱车。
化妆指数:保湿。请选用中性保湿型霜类化妆品。
感冒指数:较易发。天较凉,增加衣服,注意防护。
空气污染指数:暂无。
紫外线指数:最弱。辐射弱,涂擦SPF8-12防晒护肤品。
舒适度指数:舒适。白天不冷不热,风力不大。

------------------------
1月29日 多云
------------------------
11℃/15℃
------------------------
东北风微风
------------------------
1.gif
------------------------
1.gif
------------------------
1月30日 小雨转阴
------------------------
10℃/15℃
------------------------
东北风微风
------------------------
7.gif
------------------------
2.gif
------------------------
1月31日 多云
------------------------
11℃/13℃
------------------------
东北风微风
------------------------
1.gif
------------------------
1.gif
------------------------
2月1日 多云
------------------------
12℃/17℃
------------------------
东北风微风
------------------------
1.gif
------------------------
1.gif
------------------------
2月2日 阴转多云
------------------------
13℃/18℃
------------------------
东北风微风
------------------------
2.gif
------------------------
1.gif
------------------------
复制代码

  这样,我们通过生成的Client代码调用了第三方提供的webService服务获取到了南宁市的天气预报信息。

二、 调用免费的web service查询国内手机号码归属地

2.1、找到提供服务的Webservice的网络地址

  http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx 如下所示:

  

  找到WebService的wsdl描述信息,通过URL地址http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl:如下:

  

2.2、编写客户端访问调用WebService服务

1、创建客户端项目

  

2、根据WebService的wsdl描述生成客户端代码

  打开命令行窗口,切换到Phone_Client的src目录,执行wsimport -keephttp://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl 如下图所示:

  

  这次可以直接使用wsdl生成代码,不再需要将wsdl文件下载到本地进行修改了,这个WebService应该不是使用.net写的,生成的代码如下:

  

  3、借助生成的代码编写请求代码

复制代码
 1 package me.gacl.ws.client;
 2 
 3 import cn.com.webxml.MobileCodeWS;
 4 import cn.com.webxml.MobileCodeWSSoap;
 5 
 6 public class PhoneWsClient {
 7 
 8     public static void main(String[] args) {
 9         //创建一个MobileCodeWS工厂
10         MobileCodeWS factory = new MobileCodeWS();
11         //根据工厂创建一个MobileCodeWSSoap对象
12         MobileCodeWSSoap mobileCodeWSSoap = factory.getMobileCodeWSSoap();
13         ////调用WebService提供的getMobileCodeInfo方法查询手机号码的归属地
14         String searchResult = mobileCodeWSSoap.getMobileCodeInfo("15177196635", null);
15         System.out.println(searchResult);
16     }
17 }
复制代码

  运行结果如下:
  

  这样我们调用第三方提供的WebService服务成功查询到了手机号码的归宿地。

  以上就是如何调用第三方WebService的相关内容。

<think> 根据用户查询和提供的引用,用户想要了解如何使用Apache CXF生成和调用第三方WebService服务接口。引用中包含多个相关示例:引用1展示如何使用wsdl2java工具生成客户端代码;引用2、3、4、5分别展示了调用WebService的不同方式。需要整合这些信息,给出清晰的步骤。 首先明确核心步骤:生成客户端代码(通过WSDL)和编写调用代码。根据引用1,使用CXF的wsdl2java命令生成客户端代码时需指定编码和WSDL地址。格式为: ``` wsdl2java -encoding utf8 <WSDL_URL> ``` 对于调用方式,引用5展示了传统JAX-WS调用方式(通过Service和Call对象),而引用2、3、4则涉及更现代的CXF特定API(如JaxWsProxyFactoryBean)。考虑到易用性和流行度,优先推荐以下两种方法: 1. **使用JaxWsProxyFactoryBean(动态代理)**:直接创建服务接口的代理对象,像调用本地方法一样调用远程服务(引用3中服务端类似,客户端同理)。 2. **使用JAX-WS Dispatch API(动态调用)**:无需生成客户端代码,适合接口不固定的场景(引用4展示了属性配置,但需调整)。 结合用户需求(生成并调用第三方服务),应首先生成客户端代码再调用。因此详细步骤为: **步骤1:生成客户端代码** - 下载CXF并解压,进入bin目录执行命令(如引用1): ```shell wsdl2java -encoding utf8 http://第三方服务WSDL地址?wsdl ``` 生成Java类后导入项目。 **步骤2:编写调用代码** - **方法A:使用JaxWsProxyFactoryBean(推荐)** ```java import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; // 假设生成的服务接口名为ThirdPartyService public class Client { public static void main(String[] args) { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(ThirdPartyService.class); factory.setAddress("http://第三方服务地址"); ThirdPartyService service = (ThirdPartyService) factory.create(); // 调用方法 String result = service.someMethod("参数"); System.out.println(result); } } ``` - **方法B:使用JAX-WS客户端(传统方式,如引用5)** ```java import javax.xml.namespace.QName; import javax.xml.ws.Service; // 假设生成的Service类为ThirdPartyServiceService public class Client { public static void main(String[] args) { QName serviceName = new QName("命名空间URI", "服务本地名称"); Service service = ThirdPartyServiceService.create(serviceName); ThirdPartyService port = service.getPort(ThirdPartyService.class); String result = port.someMethod("参数"); } } ``` **注意事项**: - 参数命名问题:如引用2所述,若服务端方法参数显示为arg0,需在服务端添加`@WebParam(name="参数名")`注解(但第三方服务不可控时,客户端需按WSDL定义处理)。 - 依赖配置:项目中需包含CXF库(如cxf-rt-frontend-jaxws等)。 最后,相关问题围绕CXF使用的进阶场景设计。 </think> ### 使用CXF生成并调用第三方WebService接口的方法 以下是基于Apache CXF框架生成客户端代码并调用第三方WebService服务的完整流程: --- #### 一、生成客户端代码(通过WSDL) 1. **准备CXF工具包** 下载[Apache CXF](https://cxf.apache.org/)并解压,进入`bin`目录。 2. **执行代码生成命令** 在命令行执行(参考引用[1][^1]): ```shell wsdl2java -encoding utf8 -d 输出目录 -client http://第三方服务地址?wsdl ``` - `-encoding utf8`:指定编码防止中文乱码 - `-d`:指定生成代码的存放目录 - `-client`:同时生成调用示例代码 3. **生成结果** 将生成以下文件: - 服务接口(如 `UserService.java`) - 服务实现类(如 `UserServiceImpl.java`) - 客户端调用示例(`...Client.java`) --- #### 二、调用WebService的三种方式 ##### 方式1:动态代理(推荐,类似本地调用) ```java // 引用[2][^3]示例修改 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; public class Client { public static void main(String[] args) { // 创建代理工厂 JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(UserService.class); // 设置服务接口 factory.setAddress("http://10.2.152.251:8003/userRoleAutho"); // 服务地址 // 创建代理对象并调用 UserService service = (UserService) factory.create(); String result = service.getUserInfo("张三"); // 直接调用接口方法 System.out.println("返回结果: " + result); } } ``` ##### 方式2:JAX-WS标准调用(需生成客户端代码) ```java // 基于引用[3][^3]修改 import javax.xml.namespace.QName; import javax.xml.ws.Service; import java.net.URL; public class Client { public static void main(String[] args) throws Exception { URL wsdlUrl = new URL("http://podev.ninestar.com:50000/dir/wsdl?wsdl"); QName serviceName = new QName("http://namespace", "ServiceName"); // 查WSDL确定 Service service = Service.create(wsdlUrl, serviceName); UserService port = service.getPort(UserService.class); System.out.println(port.getUserInfo("李四")); } } ``` ##### 方式3:动态调用(无需生成客户端代码) ```java // 引用[5][^5]示例修改 import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; public class DynamicClient { public static void main(String[] args) throws Exception { String wsdlUrl = "http://10.2.152.251:8003/userRoleAutho?wsdl"; // 创建动态客户端 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient(wsdlUrl); // 调用方法:参数为方法名 + 实际参数 Object[] result = client.invoke("getUserInfo", "王五"); System.out.println("返回结果: " + result[0]); } } ``` --- #### 三、关键配置说明 1. **解决参数名问题**(引用[2][^2]) 若服务端参数显示为`arg0`,需在服务端方法添加注解: ```java @WebMethod String getUserInfo(@WebParam(name = "userName") String name); ``` 2. **连接配置**(引用[4][^4]) ```java // 设置连接超时(单位毫秒) ClientPolicy policy = new ClientPolicy(); policy.setConnectionTimeout(3000); ((BindingProvider)port).getRequestContext() .put(ClientPolicy.class.getName(), policy); ``` --- #### 四、依赖配置(Maven) ```xml <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.4.0</version> </dependency> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值