最近做的項目都是同webService有關的,自然就要關心一下webservice方面的資源。
http://www.wopos.com/webservice/Weather.asmx?op=getWeather |
|
是一個天氣預報的webservice,從它的輸出結果來看天氣資料應該來自中央氣象局的問天網
不過這方面就不用再多關心了,我們關心的是怎樣調用這個webservice。
首先登入www.wopos.com/webservice/Weather.asmx?op=getWeather。可以看到如下的SOAP資訊
請求:
以下內容為程式碼: 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部分全部複製下來建立一個XML檔案(普通的文字檔也可以),為了以後編程方面,把
以下內容為程式碼: ... <mCity>string</mCity> ... |
|
改成
以下內容為程式碼: ... <mCity>${city}$</mCity> ... |
|
以weathersoap.xml儲存在以後產生的類的同一目錄。
響應:
以下內容為程式碼: 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="h ttp://www.w3.org/2001/XMLSchema" xmlns:soap="h ttp://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <getWeatherResponse xmlns="h ttp://tempuri.org/"> <getWeatherResult>string</getWeatherResult> </getWeatherResponse> </soap:Body> </soap:Envelope> |
|
在後面對XML的解釋要用到響應部分的XML描述
接下就開始寫代碼了。
以下內容為程式碼: 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);//用傳入的參數city替換原來的${city}$ } catch (Exception ex) { ex.printStackTrace(); return null; } } /* *返回InputStream是因為w3c DOM中Document的parse方法可 *以接受InputStream類型的參數,方面在下一步對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對返回的XML進行解釋 * */ 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; } } } |
|
寫個main方法檢驗一下結果
以下內容為程式碼: public static void main(String[] args)throws Exception { System.out.println(WeatherReport.getWeather("珠海")); } |
|
結果如下
以下內容為程式碼: 城市==珠海,日期==4.02-4.03,圖1==http://weather.tq121.com.cn/images/a1.gif,圖2==http://weather.tq121.com.cn/images/00.gif,天氣==多雲,溫度==28℃~22℃,風==微風,紫外線==弱 |
|
結果是有點亂,不過只要把它分割開來也是很容易的事。
在自己的應用程式中加上天氣預報的功能,對程式的競爭力也是有好處的,而且實現也相當的簡單,何樂而不為呢?