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 }