1. 程式人生 > >WebService的基本介紹和呼叫例項

WebService的基本介紹和呼叫例項

本文由Markdown語法編輯器編輯完成。

1. WebService的基本介紹

傳統上,我們把計算機後臺程式(Daemon)提供的功能,稱為”服務”(service)。比如,讓一個防毒軟體在後臺執行,它會自動監控系統,那麼這種自動監控就是一個”服務”。通俗地說,”服務”就是計算機可以提供的某一種功能。

根據來源的不同,”服務”又可以分成兩種:一種是“本地服務”(使用同一臺機器提供的服務,不需要網路),另一種是“網路服務”(使用另一臺計算機提供的服務,必須通過網路才能完成)。

“網路服務”(Web Service)的本質,就是通過網路呼叫其他網站的資源。

因此,通過學習和使用WebService,我們可以充分利用網際網路上提供的種類繁多的服務(如查詢手機號碼歸屬地,查詢各個城市的時間和天氣預報,查詢股票行情,查詢航班資訊等等),而不是僅僅侷限於由本機電腦提供有限的服務。畢竟網路的資源是無限的,通過直接呼叫其他網站提供的服務,我們可以最大限度地提高我們的工作效率,不重複製造輪子,把精力放在我們自己的業務實現上。

2. 通過JavaScript構建WebService客戶端

以下是基於JavaScript,通過傳送Ajax的GET請求,向WebService的服務端請求,並返回接收到的資料的簡單示例。

其中,testWebService.html程式碼如下:

<!DOCTYPE html>
<html>

<head>
    <title>WebService Client test page</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"
/>
</head> <body> <script src="./jquery-2.1.3.min.js"></script> <script src="./testWebServiceClient.js"></script> <script> document.write("<h1>Send WebService Get and Post:</h1>"); </script> <div> <input id="sendWebServiceGet" onclick
="sendWebServiceGet();" type="button" value="SendGet">
</br> </div> </body> </html>
function sendWebServiceGet() 
{
   var getRegionCountryURL = 'http://ws.webxml.com.cn//WebServices/WeatherWS.asmx/getRegionCountry';
   $.ajax({
        url: getRegionCountryURL,
        type: 'Get',
        dataType: 'JSONP',
        contentType: "text/xml; charset=utf-8", 
        success: function(data){
            console.log(data);  
        },
        error: function(msg){
            console.log(msg);
        }
    })
}

這裡寫圖片描述

這裡寫圖片描述

雖然按照上面JS檔案的寫法,可以向WebService伺服器發出GET請求,並且在jQuery的回撥函式中,也可以得到從伺服器返回來的資料。但是,在瀏覽器的後臺,卻丟擲了錯誤資訊:
Uncaught SyntaxError: Unexpected token <”。

根據這個連結給出的答案可以知道產生這個問題的原因:
https://stackoverflow.com/questions/19934187/unexpected-token-reading-xml-file
“The response you are getting is an XML document, not a JavaScript program following the JSONP pattern. You get the error because the browser is trying to execute the XML as JavaScript (which it isn’t). Either change the response to be JSONP, or use some other method to make a cross-domain request.”
(你得到的響應是一個XML的文件,而不是JSONP樣式的JavaScript程式. 你得到這個錯誤是因為瀏覽器在努力把XML執行為JavaScript, 實際上它並不是. 修改回覆為JSONP,或者用別的方法生成一個跨域的請求.)

3. 基於瀏覽器訪問WebService服務的例項

以下演示一個從網路上查詢到的可用的WebService的服務:
這個WebService提供的服務是“查詢2400多個城市天氣預報Web服務”,包含2300個以上中國城市和100個以上國外城市天氣預報資料。資料每2.5小時左右自動更新一次,準確可靠。
http://ws.webxml.com.cn/WebServices/WeatherWS.asmx

這個WebService提供瞭如下服務:
(1) getRegionCountry: 獲得國外國家名稱和與之對應的ID
輸入引數:無;
返回資料:一維字串陣列。

(2) getRegionDataset: 獲取中國省份、直轄市、地區;國家名稱(國外)和與之對應的ID
輸入引數:無;
返回資料:DataSet。

(3) getRegionProvince: 獲得中國省份、直轄市、地區和與之對應的ID
輸入引數:無;
返回資料:一維字串陣列。

(4) getSupportCityDataset: 獲得支援的城市/地區名稱和與之對應的ID
輸入引數:theRegionCode = 省市、國家ID或名稱;
返回資料:DataSet。

(5) getSupportCityString: 獲得支援的城市/地區名稱和與之對應的ID
輸入引數:theRegionCode = 省市、國家ID或名稱;
返回資料:一維字串陣列。

(6) getWeather: 獲得天氣預報資料
輸入引數:城市/地區ID或名稱;
返回資料:一維字串陣列。

下面我們來演示如何根據它提供的WebService和介面,來獲取國外城市(London)和國內城市(Beijing)的實時天氣預報。

3.1 獲取英國倫敦的天氣預報:

首先呼叫getRegionCountry介面,獲取這個服務支援的國外國家的ID。
這裡寫圖片描述

從返回的國家名稱和ID中可以看到,英國對應的ID是:3247.

然後再呼叫getSupportCityString,獲取該天氣預報服務支援英國的哪些城市。呼叫這個服務時,需要輸入國家的名稱或ID。
這裡寫圖片描述

如上圖所示,在輸入框中輸入英國的ID:3247,點選呼叫按鈕,可以看到該服務支援的英國城市列表:
這裡寫圖片描述

可以看到英國有三個城市支援該服務,愛丁堡,倫敦和曼切斯特。
倫敦的城市ID為:2503.

最後呼叫getWeather的服務,該服務需要輸入兩個引數。
這裡寫圖片描述

其中theCityCode輸入2503, theUserID可以不填,點選呼叫按鈕,即可以看到該服務提供的倫敦的天氣預報資料。這個資料是包括今天在內的,未來五天的天氣預報資料。
這裡寫圖片描述

3.2 獲取中國北京的天氣預報:

按照同樣的方法,我們可以通過依次呼叫
getRegionProvince獲取中國國內省份的ID列表:
這裡寫圖片描述

可以看到北京市的ID是311101。
這裡赫然出現了釣魚島,再強調一次:釣魚島自古以來就是中國神聖的不可分割的領土,釣魚島是中國的。

再呼叫getSupportCityString, 輸入311101,即可獲取北京市內的各個區的ID,如下所示:
這裡寫圖片描述

這裡寫圖片描述

最後呼叫getWeather介面,輸入北京城區的ID: 792, 即可獲取北京城區的天氣預報。
這裡寫圖片描述

4. 基於SoapUI模擬WebService客戶端

5. 可用的WebService地址列表:

……

參考連結: