『動善時』JMeter基礎 — 51、使用JMeter測試WebService接口
- 2021 年 7 月 3 日
- 筆記
- 測試基礎必會技能 - JMeter工具
因為我之前對
WebSocket
接口也不是很了解,所以本篇文章先簡單的概括的說明一下WebService
的相關概念。在文章的後半部分,進行測試WebSocket
接口的步驟說明。
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: "//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="//schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:xsd="//www.w3.org/2001/XMLSchema">
<soap:Body>
<getSupportCity xmlns="//WebXml.com.cn/">
<byProvinceName>廣東</byProvinceName>
</getSupportCity>
</soap:Body>
</soap:Envelope>
說明:
- 可以看到,一個SOAP請求其實就是一個HTTP請求,但為了表明內容是SOAP的數據,需要加入上面請求頭中
SOAPAction: "//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="//www.w3.org/2003/05/soap-envelope" xmlns:web="//WebXml.com.cn/">
<soap:Header>
<m:Trans xmlns:m="//www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
<soap:Body>
<getSupportCity xmlns="//WebXml.com.cn/">
<byProvinceName>廣東</byProvinceName>
</getSupportCity>
</soap:Body>
</soap:Envelope>
逐個解釋裏面的元素:
Envelope
:SOAP的請求內容必須以Envelope
做為根節點。
xmlns:soap="//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="//schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:xsd="//www.w3.org/2001/XMLSchema">
<soap:Body>
<getSupportCityResponse xmlns="//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文件的地址。例如我們訪問://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
接口,就必定要告訴對方,我們要調用的是一個什麼方法,以及這個方法的參數的值等等。
我們以一個查詢城市天氣預報的地址//www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl
為例,訪問這個接口,我們就可以看到這個接口下有什麼方法和參數。
1)訪問WebService接口的地址
就是上面的地址,//www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl
。
2)如何獲取請求參數
也就是如何表示數據,用什麼格式去表示函數以及它的參數。
我經常使用SoapUI
工具來解析WebService
接口內容,可以獲取到接口的地址,接口的個數,和接口的參數。
上面訪問的地址解析後,如下圖所示:
說明:我們要查詢天氣,就需要調用getSupportCity
方法,後邊紅框中就是請求中的內容。
5、使用JMeter測試WebService接口示例
查詢天氣的WebService
服務的WSDL文檔訪問地址://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)
編輯完的界面內容如下:
說明:
- 接口基本信息部分,就是分解這個
//www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl
地址。 - 而請求發送的參數,就是上面用
SoapUI
工具來解析WebService
接口,如下:<soap:Envelope xmlns:soap="//www.w3.org/2003/05/soap-envelope" xmlns:web="//WebXml.com.cn/"> <soap:Header/> <soap:Body> <web:getSupportCity> <!--Optional:--> <web:byProvinceName>山東</web:byProvinceName> </web:getSupportCity> </soap:Body> </soap:Envelope>
這種格式的數據,只能放在消息體數據選項頁中。
(4)運行查看結果
結果如下圖所示:
和在SoapUI
工具中請求的數據一樣,如下圖:
這就說明我們使用JMeter訪問WebService
接口成功了。
參考: