因為我之前對
WebService接口也不是很了解,所以本篇文章先簡單的概括的說明一下WebService的相關概念。在文章的后半部分,進行測試WebService接口的步驟說明。
1、什么是WebService
(1)先說說什么是服務
想要理解WebService,必須先理解什么是Service(服務)。
傳統上,我們把計算機后台程序(Daemon)提供的功能,稱為"服務"(Service)。比如,讓一個殺毒軟件在后台運行,它會自動監控系統,那么這種自動監控就是一個"服務"。通俗地說,"服務"就是計算機可以提供的某一種功能。
根據來源的不同,"服務"又可以分成兩種:
一種是"本地服務":使用同一台機器提供的服務,不需要網絡。
另一種是"網絡服務":使用另一台計算機提供的服務,必須通過網絡才能完成。
舉例來說:
- 我現在有一批圖片,需要把它們的大小縮小一半。那么,我們可以把"縮放圖片"看成是一種服務。你可以使用"本地服務",在自己計算機上用軟件縮小圖片,也可以使用"網絡服務",將圖片上傳到某個網站,讓服務器替你縮小圖片,完成后再通過網絡送回給你。
- 再比如,一件事你可以自己做,也可以交給另一個人去做。肚子餓了,你可以自己做飯,也可以打電話去訂一份比薩,讓店家替你做好送上門。
(2)什么是WebService
WebService直譯就是網絡服務的意思。"網絡服務"的本質,就是通過網絡調用其他網站的資源。
而WebService服務的標准解釋:WebService是一種跨編程語言和跨操作系統平台的遠程調用技術。
解釋說明:
- 所謂跨編程語言:就是說服務端程序采用Java編寫,客戶端程序則可以采用其他編程語言編寫,反之亦然!
- 所謂跨操作系統平台:則是指服務端程序和客戶端程序可以在不同的操作系統上運行。
- 所謂遠程調用:就是通過網絡,一台計算機A上的一個程序可以調用到另外一台計算機B上的一個服務接口。
總結:
WebService就是一個應用程序向外界暴露出一個能通過Web進行調用的API,也就是說能用編程的方法通過Web來調用這個應用程序。- 我們把調用這個
WebService服務的應用程序叫做客戶端,而把提供這個WebService服務的應用程序叫做服務端。 WebService是建立可互操作的分布式應用程序的一個平台,是一套標准。它定義了應用程序如何在Web上實現互操作性,可以用任何你喜歡的語言,在任何你喜歡的平台上寫Web service,只要我們可以通過Web service標准對這些服務進行查詢和訪問。
也就是說
WebService是一個平台,是一個標准,實現跨編程語言和跨操作系統平台的遠程調用服務。並且
WebService規范實施的應用之間, 無論它們所使用的語言、 平台或內部協議是什么, 都可以相互交換數據。
2、WebService和SOAP的關系
可以簡單的理解:
WebService=SOAP+WSDL
(1)SOAP請求協議介紹
SOAP(Simple Object Access Protocol):簡單對象訪問協議。(也就是需要遵守的規則)
SOAP傳輸協議使用的就是HTTP協議,SOAP請求是HTTP中POST請求的一個專用版本,也可以說成是對HTTP中POST請求的一種封裝。遵循一種特殊的XML消息格式,請求頭屬性Content-type設置為text/xml的時候,任何數據都可以XML化。
SOAP請求的內容:
# 請求頭內容
POST /WebServices/WeatherWebService.asmx HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3603)
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://WebXml.com.cn/getSupportCity"
Host: www.webxml.com.cn
Content-Length: 348
Expect: 100-continue
Connection: Keep-Alive
# 請求體內容
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<getSupportCity xmlns="http://WebXml.com.cn/">
<byProvinceName>廣東</byProvinceName>
</getSupportCity>
</soap:Body>
</soap:Envelope>
說明:
- 可以看到,一個SOAP請求其實就是一個HTTP請求,但為了表明內容是SOAP的數據,需要加入上面請求頭中
SOAPAction: "http://WebXml.com.cn/getSupportCity"部分來以示區別。 - 也就是說,如果請求頭中有
SOAPAction屬性,那么請求會被當作SOAP的內容來處理而不會當作HTML來解析。 - 當然可以用上面指定
SOAPAction頭來表示內容是SOAP的內容,也可以指定Content-Type: application/soap+xml來表示內容是SOAP的內容。 - SOAP請求中最后的那段XML數據,這個就是請求的具體內容,這個就是SOAP規定的請求數據格式。
(2)SOAP請求的數據格式
上面知道了SOAP請求是通過HTTP協議的POST方法來傳輸數據的,只不過是請求的Header中加了一些標識來說明自己是一個SOAP請求。
而發送數據的具體格式,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://WebXml.com.cn/">
<soap:Header>
<m:Trans xmlns:m="http://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
<soap:Body>
<getSupportCity xmlns="http://WebXml.com.cn/">
<byProvinceName>廣東</byProvinceName>
</getSupportCity>
</soap:Body>
</soap:Envelope>
逐個解釋里面的元素:
Envelope:SOAP的請求內容必須以Envelope做為根節點。
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"不能修改,否則會出錯。Header:這個是可選的,如果需要添加Header元素,那么它必須是Envelope的第一個元素。
Header的內容並沒有嚴格的限制,我們可以自己添加一些和應用程序相關的內容,但是客戶端一定要記得處理這些Header元素,可以加上mustUnderstand強制進行處理。Body:這個就是請求的主題內容了,請求什么函數,參數是什么類型等等都在這里面指定。
用標簽表示一個函數,然后用子元素表示它的參數。
在調用時不需要指定參數和返回類型,因為提供服務的一方已經規定好了數據類型,在調用時指定數據類型沒有任何意義。- 在
<soap:Body>里面的內容:就是請求的內容,請求的方法為getSupportCity,該方法有一個名為byProvinceName的參數,參數的值為“廣東”這個字符串。
再看一下返回的內容:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<getSupportCityResponse xmlns="http://WebXml.com.cn/">
<getSupportCityResult>
<string>廣州 (59287)</string>
<string>深圳 (59493)</string>
<string>珠海 (59488)</string>
<string>汕頭 (59316)</string>
<string>佛山 (59279)</string>
</getSupportCityResult>
</getSupportCityResponse>
</soap:Body>
</soap:Envelope>
3、什么是WSDL
(1)WSDL的定義:WSDL(Web Services Description Language)指網絡服務描述語言 。是基於 XML 的用於描述 WebServices 以及如何訪問 WebServices 的語言。
(2)WSDL的作用:WSDL 是一種使用 XML 編寫的文檔,這種文檔可描述某個 WebService服務。它可規定服務的位置,以及此服務提供的操作(或方法)。
具體的解釋說明:
1)WSDL到底是什么?
好比我們去商店買東西,首先要知道商店里有什么東西可買,然后再來購買,商家的做法就是張貼廣告海報。
同理
WebServices也一樣,WebServices客戶端要調用一個WebServices服務,首先要有知道這個服務的地址在哪,以及這個服務里有什么方法可以調用。所以,
WebServices務器端首先要通過一個WSDL文件,來說明自己家里有啥服務可以對外調用。比如:
服務是什么:服務中有哪些方法,方法接受的參數是什么,返回值是什么。
服務的網絡地址用哪個URL地址表示。
服務通過什么方式來調用。
2)WSDL的作用是什么?
WSDL就是一個基於XML的語言,用於描述
WebServices及其函數、參數和返回值。它是
WebServices客戶端和服務器端都能理解的標准格式。因為是基於XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。
一些最新的開發工具,既能根據你的
WebServices生成WSDL文檔,又能導入WSDL文檔,生成調用相應WebServices的代理類代碼。3)WSDL文件存在的位置?
WSDL文件保存在Web服務器上,通過一個URL地址就可以訪問到它。
客戶端要調用一個
WebServices服務之前,要知道該服務的WSDL文件的地址。例如我們訪問:http://www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl,我們就可以看到這個接口下有什么方法和參數。
WebServices服務提供商可以通過兩種方式來暴露它的WSDL文件地址:1、注冊到UDDI服務器,以便被人查找;
2、直接告訴給客戶端調用者。
所以總結來說:
WebServices是一個平台,是一個標准,是一個規范,不是實實在在的東西,簡單的說是通過SOAP請求協議和WSDL語言構成的,但總體呈現出來的效果,也可以稱之為一種技術。- SOAP是一種訪問協議,具體的技術。
- WSDL是一種網絡服務描述語言,具體的技術。
4、測試WebService接口前的准備
(1)如何判斷是WebService接口
- 詢問開發可知。
- 通過地址查看可知。如果接口URL地址最后有WSDL,表示該接口為
WebService接口。 - 通過瀏覽器展示的信息可知。在瀏覽器中訪問該接口URL地址,如果返回如下圖所示的內容,說明該接口就是一個WebService接口。

(2)如何獲取WebService接口相關信息
- 查看接口文檔(上上策)。
- 通過瀏覽器展示的信息可知。
- 通過工具查看可知(這里推薦
SoapUI工具)。
如果我們要調用遠程的WebService接口,就必定要告訴對方,我們要調用的是一個什么方法,以及這個方法的參數的值等等。
我們以一個查詢城市天氣預報的地址http://www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl為例,訪問這個接口,我們就可以看到這個接口下有什么方法和參數。
1)訪問WebService接口的地址
就是上面的地址,http://www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl。
2)如何獲取請求參數
也就是如何表示數據,用什么格式去表示函數以及它的參數。
我經常使用SoapUI工具來解析WebService接口內容,可以獲取到接口的地址,接口的個數,和接口的參數。
上面訪問的地址解析后,如下圖所示:

說明:我們要查詢天氣,就需要調用getSupportCity方法,后邊紅框中就是請求中的內容。
5、使用JMeter測試WebService接口示例
查詢天氣的WebService服務的WSDL文檔訪問地址:http://www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl
(1)測試計划內包含的元件
添加元件操作步驟:
- 創建測試計划。
- 創建線程組:
選中“測試計划”右鍵 —> 添加 —> 線程(用戶) —> 線程組。 - 在線程組中,添加配置元件HTTP信息頭管理器組件:
選中“線程組”右鍵 —> 添加 —> 配置元件 —> HTTP信息頭管理器。 - 在線程組中,添加取樣器“HTTP請求”組件:
選中“線程組”右鍵 —> 添加 —> 取樣器 —> HTTP請求。 - 在線程組中,添加監聽器“察看結果樹”組件:
選中“線程組”右鍵 —> 添加 —> 監聽器 —> 察看結果樹。
最終測試計划中的元件如下:

點擊運行按鈕,會提示你先保存該腳本,腳本保存完成后會直接自動運行該腳本。
(2)HTTP信息頭管理器內容
前面說過SOAP傳輸協議是一種封裝的HTTP中的POST請求,並且請求頭屬性Content-type設置為text/xml的時候,任何數據都可以XML化。
所需我們需要在請求的請求頭信息中,添加Content-type=text/xml。
如下圖所示:

(3)HTTP請求界面內容
在JMeter中,並沒有發送SOAP請求的取樣器,又因為SOAP傳輸協議是一種封裝的HTTP中的POST請求,所示我們創建一個HTTP請求取樣器,來發送SOAP請求即可。(請求方式POST)
編輯完的界面內容如下:

說明:
- 接口基本信息部分,就是分解這個
http://www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl地址。 - 而請求發送的參數,就是上面用
SoapUI工具來解析WebService接口,如下:
這種格式的數據,只能放在消息體數據選項頁中。<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://WebXml.com.cn/"> <soap:Header/> <soap:Body> <web:getSupportCity> <!--Optional:--> <web:byProvinceName>山東</web:byProvinceName> </web:getSupportCity> </soap:Body> </soap:Envelope>
(4)運行查看結果
結果如下圖所示:

和在SoapUI工具中請求的數據一樣,如下圖:

這就說明我們使用JMeter訪問WebService接口成功了。
參考:
