废话不多说,上次说道发布自己的webservice,这次我们来看看如何调用别人写的webservice,这是一个牛人写的代码,我对他进行了简单的分析,大家可以参考参考:
/**
* @author :LYL
*@date:2011-4-20,下午05:04:10
*/
package com.lyl.webservice;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class WeatherClient {
//服务主机
private static String SERVICES_HOST = "www.webxml.com.cn";
//天气服务URL
private static String WEATHER_SERVICES_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/";
//获取省份code的URL
private static String PROVINCE_CODE_URL = WEATHER_SERVICES_URL
+ "getRegionProvince";
//获取城市code的URL
private static String CITY_CODE_URL = WEATHER_SERVICES_URL
+ "getSupportCityString?theRegionCode=";
//天气查询的URL
private static String WEATHER_QUERY_URL = WEATHER_SERVICES_URL
+ "getWeather?theUserID=&theCityCode=";
private WeatherClient(){}
public static void main(String[] args) throws Exception{
int provinceCode = getProvinceCode("江苏");
int cityCode = getCityCode(provinceCode, "苏州");
List<String> weatherList = getWeather(cityCode);
for(String weather:weatherList){
System.out.println(weather);
}
}
/**
* 得到省份ID
* @param provinceName
* @return
*/
public static int getProvinceCode(String provinceName){
Document document;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//设定支持命名空间
dbf.setNamespaceAware(true);
int provinceCode = 0;
try{
//通过文档构建器工厂获取一个文档构建器
DocumentBuilder db = dbf.newDocumentBuilder();
//获得province_code的输入流
InputStream inputStream = getSoapInputStream(PROVINCE_CODE_URL); //具体webService相关
document = db.parse(inputStream);
//获取所有标签名为string的节点
NodeList nodeList = document.getElementsByTagName("string"); //具体webService相关
int len = nodeList.getLength();
for(int i = 0; i < len; i++){
Node n = nodeList.item(i);
//获得省份名和对应的代码
String result = n.getFirstChild().getNodeValue();
//将省份名和代码区分开
String[] address = result.split(",");
String pName = address[0];
String pCode = address[1];
//判断是否是我们需要的省份
if(pName.equalsIgnoreCase(provinceName)){
provinceCode = Integer.parseInt(pCode);
}
}
//关闭流
inputStream.close();
}catch(DOMException e){
e.printStackTrace();
}catch(ParserConfigurationException e){
e.printStackTrace();
}catch (SAXException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
return provinceCode;
}
/**
* 获取城市ID
* @param provinceCode
* @param cityName
* @return
*/
public static int getCityCode(int provinceCode, String cityName){
Document document;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
int cityCode = 0;
try{
DocumentBuilder db = dbf.newDocumentBuilder();
InputStream inputStream = getSoapInputStream(CITY_CODE_URL + provinceCode); //具体webService相关
document = db.parse(inputStream);
NodeList nl = document.getElementsByTagName("string"); //具体webService相关
int len = nl.getLength();
for(int i = 0; i < len; i++){
Node n = nl.item(i);
String result = n.getFirstChild().getNodeValue();
String[] address = result.split(",");
String cName = address[0];
String cCode = address[1];
if(cName.equalsIgnoreCase(cityName)){
cityCode = Integer.parseInt(cCode);
}
}
inputStream.close();
}catch(DOMException e){
e.printStackTrace();
}catch(ParserConfigurationException e){
e.printStackTrace();
}catch (SAXException e){
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
return cityCode;
}
/**
* 取得url连接返回的输入流
* @param url
* @return
*/
public static InputStream getSoapInputStream(String url){
InputStream inputStream = null;
try{
URL urlObj = new URL(url);
//得到URL所引用的远程对象的连接
URLConnection urlConn = urlObj.openConnection();
//设置一般请求属性
urlConn.setRequestProperty("Host", SERVICES_HOST); //具体webService相关
urlConn.connect();
//返回从此打开的连接读取的输入流
inputStream = urlConn.getInputStream();
}catch(MalformedURLException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
return inputStream;
}
/**
* 获取天气信息
* @param cityCode
* @return
*/
public static List<String> getWeather(int cityCode){
List<String> weatherList = new ArrayList<String>();
Document document;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
try{
DocumentBuilder db = dbf.newDocumentBuilder();
InputStream inputStream = getSoapInputStream(WEATHER_QUERY_URL + cityCode);
document = db.parse(inputStream);
NodeList nl = document.getElementsByTagName("string");
int len = nl.getLength();
for(int i = 0; i < len; i++){
Node n = nl.item(i);
String weather = n.getFirstChild().getNodeValue();
weatherList.add(weather);
}
inputStream.close();
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}catch (DOMException e){
e.printStackTrace();
}catch (ParserConfigurationException e){
e.printStackTrace();
}catch(SAXException e){
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
return weatherList;
}
}
大家如果想自己编写可以参考此代码,至于调用何种服务要跟具体的服务提供商有关,大家可以用此例子试验下。