WebService 常用免费调用接口 与 JWS(Java Web Service) 调用第三方 webService 天气服务

转https://wangmaoxiong.blog.csdn.net/article/details/87370571

wsimport 生成代理类

1、已经知道 Java 开发时,使用自带的 wsimport.exe 工具即可根据服务端提供的 WSDL 文件生成客户端代理类,所以第一步就是根据上面的 WSDL 地址生成客户端使用的代理类。

解析组件 's:schema' 时出错:

 

、如上所示生成时出错,执行失败,出现的原因是 webService 服务端如果是 .net 写的,则使用 Java wsimport.exe 生成时就会报错。

2、开发中如果没有遇到这个错误,自然是最好,万一遇到,则可以一试,亲测有效。

解决办法

1、针对 .net 开发的 webService 服务端,Java wsimport.exe 生成代理类出错解决办法如下:

1)将服务端的 wsdl 文档保存到本地,如 E:\wmx\webservice\weather.wsdl.xml、E:\wmx\webservice\weather.wsdl、E:\wmx\webservice\weather.xml (经实测文件的后缀名其实关系不大,都可以正常生成)

2、修改 wsdl 文档以下内容:
将文件中所有的 <s:element ref="s:schema" /><s:any /> 替换成 <s:any minOccurs="2" maxOccurs="2"/>

 

 

 2、直接在 wsdl 文档页面右键,选择查看源代码,然后将 Ctrl + S 保存即可,然后便可打开文件,替换其中的内容:

 

 

3、此时使用 wsimport.exe 再次生成,便可以正确执行:

 

 

 

JWS 客户端调用

1、显然这种别人写的服务端,不用多想,将生成的 .java 文件全部导入即可,然后需要找到里面的服务接口,可以凭直觉,也可以从 wsdl 文档中的 <service> 元素中查找

2、通常情况下,从 wsdl 的 Url 地址中也是可以找到的,如本例的 :http://www.webxml.com.cn/WebServices/Weath
erWebService.asmx?wsdl,就是其中的 "WeatherWebService"

 

 

 、将生成好的 .java 文件导入到项目中:

 

 

特别提醒:

1)代理类中有些类相互引用时,使用的是绝对地址,如在 WeatherWebServiceSoap 接口中使用了这样的代码, cn.com.webxml.ArrayOfString 来引用 ArrayOfString ,于是要不就是自己新建和它一样的包,然后放置进去,如上所示,要不就是修改源码中原来的包名和自己包名的保持一致,否则报错。

2)因为 wsimport.exe 是转换的本地的 wsdl 文件,而不是在线的 wsdl 文件,所以代码中关联的也是本地的 wsdl 文件,这个文件必须存在,如果这个文件删除了,则项目运行的时候就会找不到而解析失败。所以如果文件移动了位置,则代码中也要相应的修改。

3)建议将 wsdl 文件放在项目中(资源目录下),这样就可以和项目一起移动,否则如果将来项目移动了,而忘了本地的 wsdl 文件,显然运行就报错了。

 

、调用测试类代码如下,这是我们自己唯一要写的代码(如果上面没有移动 wsdl文件到项目中内部的话),几行即可搞定:

 

    1. import cn.com.webxml.ArrayOfString;
    2.  
      import cn.com.webxml.WeatherWebService;
    3.  
      import cn.com.webxml.WeatherWebServiceSoap;
    4.  
       
    5.  
      import java.util.List;
    6.  
      import java.util.logging.Logger;
    7.  
       
    8.  
      /**
    9.  
      * Created by Administrator on 2019/1/25 0025.
    10.  
      */
    11.  
      public class Web_service {
    12.  
      //日志记录器
    13.  
      public static final Logger logger = Logger.getGlobal();
    14.  
       
    15.  
      public static void main(String[] args) {
    16.  
      /**1、创建实现类对象
    17.  
      * */
    18.  
      WeatherWebService weatherWebService = new WeatherWebService();
    19.  
      /** 2、获取服务接口实例
    20.  
      * 这些代码只能看着源码跟着感觉来写,因为代码完全是人家写的,对方通常也不会提供什么使用文档的
    21.  
      */
    22.  
      WeatherWebServiceSoap weatherWebServiceSoap = weatherWebService.getWeatherWebServiceSoap();
    23.  
      /**
    24.  
      *3、有了服务接口实例,就可以调用其中的方法了,这里返回值也是对方使用的对象
    25.  
      */
    26.  
      ArrayOfString arrayOfString = weatherWebServiceSoap.getWeatherbyCityName("长沙");
    27.  
      /**
    28.  
      * 4、看着源码即可轻松写出,毕竟都是程序猿,猜也猜出它的目的
    29.  
      */
    30.  
      List<String> stringList = arrayOfString.getString();
    31.  
      int count = 1;
    32.  
      for (String s : stringList) {
    33.  
      System.out.println((count++) + ":::" + s);
    34.  
      }
    35.  
      }
    36.  

 5、运行结果如下:

 

posted @ 2020-12-24 17:18  羊小洋  阅读(409)  评论(0)    收藏  举报