JAVA 如何调用网络上别人提供的WebService
以别人提供的天气预报的webService为例
服务地址是: http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx
进入http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?op=getWeather,我们可以看到请求和响应的XML文档规范
1. 请求的规范
POST /WebServices/WeatherWS.asmx HTTP/1.1
Host: webservice.webxml.com.cn
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<getWeather xmlns="http://WebXml.com.cn/">
<theCityCode>string</theCityCode>
<theUserID>string</theUserID>
</getWeather>
</soap12:Body>
</soap12:Envelope>
2. 响应的规范 (可以根据这样的一个格式来解析返回的XML文件)
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<getWeatherResponse xmlns="http://WebXml.com.cn/">
<getWeatherResult>
<string>string</string>
<string>string</string>
</getWeatherResult>
</getWeatherResponse>
</soap12:Body>
</soap12:Envelope>
下面来看下如何来发起一个请求:
(1).将请求部分中
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<getWeather xmlns="http://WebXml.com.cn/">
<theCityCode>string</theCityCode>
<theUserID>string</theUserID>
</getWeather>
</soap12:Body>
</soap12:Envelope>
另存为一个xml文件,本例中名字为weatherSoap.xml
可以将其中
...
<theCityCode>string</theCityCode>
<theUserID>string</theUserID>
...
的string替换成你自己的占位符.本例子中是替换成
...
<theCityCode>{city}</theCityCode>
<theUserID>{cityId}</theUserID>
...
(2).准备工作完毕, 下面是程序部分
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.net.Proxy.Type;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
public class GetWeather {
public static void main(String[] args) throws Exception {
}
public static String getWeather(String city, String cityId) throws Exception{
InputStream is = getSoapInputStream("南昌", ""); // 获取服务器端返回的流
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8")); //使用UTF-8进行编码.
String temp;
while ((temp = br.readLine()) != null) {
System.out.println(temp);
}
// temp 就是返回的XML文件
/*下面可以使用DOM来解析当前返回的XML*/
// DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// DocumentBuilder db = dbf.newDocumentBuilder();
// Document doc = db.parse(is);
return "";
}
/**
* 读取请求文件
* @param city
* @param cityId
* @return
* @throws Exception
*/
public static String getResource(String city, String cityId)
throws Exception {
InputStream is = new FileInputStream(new File("weathersoap.xml"));
BufferedReader br = new BufferedReader(new InputStreamReader(is)); //创建文件输入流
StringBuffer sb = new StringBuffer();
String temp;
while ((temp = br.readLine()) != null) {
sb.append(temp); // 将文件的内容读取进来
}
br.close();
String soap = sb.toString();
soap = soap.replace("{city}", city);
soap = soap.replace("{cityId}", cityId); // 将文件中的占位符替换成我们所要传递的参数
return soap;
}
/**
* 该方法得到服务器端返回的输入流
* @param city 城市名称
* @param cityId 城市编码
* @return
* @throws Exception
*/
private static InputStream getSoapInputStream(String city, String cityId)
throws Exception {
String soap = getResource(city, cityId);
if (soap != null) {
URL url = new URL(
"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx");
URLConnection uc = url.openConnection(new Proxy(Type.HTTP,
new InetSocketAddress("192.168.0.1", 808))); // 建立连接,该处使用代理服务器.
//如果没使用代理服务器的话, 则直接使用url.openConnection();
uc.setUseCaches(false); // 设置不缓存
uc.setDoInput(true); // 设置可以输出
uc.setDoOutput(true); // 设置可以输入
/**
* POST /WebServices/WeatherWS.asmx HTTP/1.1
* Host: webservice.webxml.com.cn
* Content-Type: application/soap+xml; charset=utf-8
* Content-Length: length
* 下面设置头文件中的信息,可以将上面请求文件中的头信息设置进去
* 其中的length = 文件内容的长度
*/
uc.setRequestProperty("Content-Type","application/soap+xml; charset=utf-8");
uc.setRequestProperty("Content-Length", String.valueOf(soap.length()));
OutputStream os = uc.getOutputStream(); //获取连接的输入流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os,
"UTF-8"));
bw.write(soap); // 将请求的内容发送到服务器
bw.flush();
bw.close();
InputStream is = uc.getInputStream(); // 获取服务器返回的流
return is;
}
return null;
}
}
(3). 下面我们就可以使用DOM解析返回的XML文件, 获取所需要的信息s