Java访问Web Service接口

  项目中有个任务,需要调用Webservice的接口的数据 
  例如这是一个天气预报的数据接口:http://www.xxx.com/WebServices/WeatherWebService.asmx?wsdl

  第一种,采用http请求,这种跟我们经常用的HTTP请求一样,结果可以是返回XML格式的字符串,我们比较容易对其进行解析,取得我们想要的数据。

    地址:列如 http://www.xxx.com/WeatherWS/Weather.asmx?wsdl 

    调用的方法是:GetWeather    参数是  City

 1     public static void main(String args[]){
 2         //url需要使用 接口 + 方法名的形式
 3         String httpUrl = "http://www.xxx.com/WeatherWS/Weather.asmx/GetWeather";
 4         //传入的参数
 5         Map<String, String> params = new HashMap<>(2);
 6         params.put("City", "320000");
 7         //获取xml格式的数据
 8         //http请求方法可以参考我另一篇随笔  Java HTTP请求
 9         String result = HttpUtil.httpPost(httpUrl, params);
10     }

  第二种:采用axis2来调用。此种方式比较繁琐,话不多说直接上代码

  地址:列如 http://www.xxx.com/WeatherWS/Weather.asmx?wsdl 

    调用的方法是:GetWeather    参数是  City

  在浏览器上输入webservice的接口,获取接口数据,如图所示

  

   

   

 1     /**
 2      * 获取webservice接口数据
 3      * @param httpUrl   webservice接口URL
 4      * @param params    数据以K-V键值对的方式传入
 5      * @return
 6      */
 7     public static String[] getWebService(String httpUrl, Map<String, String> params) {
 8             String[] result = null;
 9             try {
10                 // 指出service所在完整的URL
11                 String endpoint = "http://www.xxx.com/WeatherWS/Weather.asmx?wsdl";
12                 //调用接口的targetNamespace 既接口中的域名 可以参考截图中对应的标签
13                 String targetNamespace = "http://WebXml.com.cn/";
14                 //调用接口的方法名
15                 String method = "GetWeather";
16                 // 创建一个服务(service)调用(call)
17                 Service service = new Service();
18                 Call call = (Call) service.createCall();// 通过service创建call对象
19                 // 设置service所在URL
20                 call.setTargetEndpointAddress(new java.net.URL(endpoint));
21                 call.setOperationName(new QName(targetNamespace, method));
22                 call.setUseSOAPAction(true);
23                 //添加参数 //设置参数名 city  第二个表示参数为String类型,第三个参数表示入参
24                 call.addParameter(new QName(targetNamespace, "city"), org.apache.axis.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN);
25                 //如果返回类型是数组  需要采用此种写法
26                 call.setReturnClass(java.lang.String[].class);//设置接口返回类型
27                 //接口数据返回为String类型   采用此种写法
28                 //call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
29                 String path = targetNamespace + method;
30                 //这里添加的path一定要采用域名 + 方法名的形式
31                 call.setSOAPActionURI(path);
32                 //添加参数所对应的参数直  有几个参数,写几个值
33                 result = (String[]) call.invoke(new Object[] {"320000"});
34             } catch (Exception e) {
35                 e.printStackTrace();
36             }
37 
38         return result;
39     }

 

posted @ 2019-03-02 16:04  遗失的岁月  阅读(434)  评论(0编辑  收藏  举报