最近做的項(xiàng)目都是同webService有關(guān)的,自然就要關(guān)心一下webservice方面的資源。
是一個(gè)天氣預(yù)報(bào)的webservice,從它的輸出結(jié)果來看天氣數(shù)據(jù)應(yīng)該來自中央氣象局的問天網(wǎng)
不過這方面就不用再多關(guān)心了,我們關(guān)心的是怎樣調(diào)用這個(gè)webservice。
首先登錄www.wopos.com/webservice/Weather.asmx?op=getWeather。可以看到如下的SOAP信息
請(qǐng)求:
以下內(nèi)容為程序代碼:
POST /webservice/Weather.asmx http/1.1
Host: www.wopos.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/getWeather"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getWeather xmlns="http://tempuri.org/">
<mCity>string</mCity>
</getWeather>
</soap:Body>
</soap:Envelope>

|
|
把XML部分全部復(fù)制下來創(chuàng)建一個(gè)XML文件(普通的文本文件也可以),為了以后編程方便,把
以下內(nèi)容為程序代碼:
... <mCity>string</mCity> ...
|
|
改成
以下內(nèi)容為程序代碼:
... <mCity>${city}$</mCity> ...
|
|
以
weathersoap.xml保存在以后生成的類的同一目錄。
響應(yīng):
以下內(nèi)容為程序代碼:
http/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getWeatherResponse xmlns="http://tempuri.org/">
<getWeatherResult>string</getWeatherResult>
</getWeatherResponse>
</soap:Body>
</soap:Envelope>

|
|
在后面對(duì)XML的解釋要用到響應(yīng)部分的XML描述
接下就開始寫代碼了。
以下內(nèi)容為程序代碼:
package jaqcy.weatherreport.client;

import java.io.*;
import java.net.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
 /** *//**
*
* @author jaqcy
*/
public class WeatherReport
  {
private static String getSoapRequest(String city)//city為要查詢天氣的城市名
 {
try
 {
Class cls=Object.class;
InputStreamReader isr=new InputStreamReader(cls.getResourceAsStream("/jaqcy/weatherreport/client/weathersoap.xml"));//讀取存在weathersoap的SOAP信息
BufferedReader reader=new BufferedReader(isr);
String soap="";
String tmp;
while((tmp=reader.readLine())!=null)
 {
soap+=tmp;
}
reader.close();
isr.close();
return soap.replace("${city}$",city);//用傳入的參數(shù)city替換原來的${city}$
}
catch (Exception ex)
 {
ex.printStackTrace();
return null;
}
}
 /**//*
*返回InputStream是因?yàn)閣3c DOM中Document的parse方法可
*以接受InputStream類型的參數(shù),方面在下一步對(duì)XML的解釋
*/
private static InputStream getSoapInputStream(String city)throws Exception
 {
try
 {
String soap=getSoapRequest(city);
if(soap==null)
 {
return null;
}
URL url=new URL("http://www.wopos.com/webservice/Weather.asmx");
URLConnection conn=url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);

conn.setRequestProperty("Content-Length", Integer.toString(soap.length()));
conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
conn.setRequestProperty("SOAPAction","\"http://tempuri.org/getWeather\"");

OutputStream os=conn.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os,"utf-8");
osw.write(soap);
osw.flush();
osw.close();

InputStream is=conn.getInputStream();
return is;
}
catch(Exception e)
 {
e.printStackTrace();
return null;
}
}
 /**//*
*用W3C DOM對(duì)返回的XML進(jìn)行解釋
*
*/
public static String getWeather(String city)
 {
try
 {
Document doc;
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db=dbf.newDocumentBuilder();
InputStream is=getSoapInputStream(city);
doc=db.parse(is);
NodeList nl=doc.getElementsByTagName("getWeatherResult");
Node n=nl.item(0);
String weather=n.getFirstChild().getNodeValue();
is.close();
return weather;
}
catch(Exception e)
 {
e.printStackTrace();
return null;
}
}
}

|
|
寫個(gè)main方法檢驗(yàn)一下結(jié)果
以下內(nèi)容為程序代碼:
public static void main(String[] args)throws Exception
 {
System.out.println(WeatherReport.getWeather("珠海"));
}

|
|
結(jié)果如下
以下內(nèi)容為程序代碼:
城市==珠海,日期==4.02-4.03,圖1==http://weather.tq121.com.cn/images/a1.gif,圖2==http://weather.tq121.com.cn/images/00.gif,天氣==多云,溫度==28℃~22℃,風(fēng)==微風(fēng),紫外線==弱
|
|
結(jié)果是有點(diǎn)亂,不過只要把它分割開來也是很容易的事。
在自己的應(yīng)用程序中加上天氣預(yù)報(bào)的功能,對(duì)程序的競(jìng)爭(zhēng)力也是有好處的,而且實(shí)現(xiàn)也相當(dāng)?shù)暮?jiǎn)單,何樂而不為呢?
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=669923