『動善時』JMeter基礎 — 51、使用JMeter測試WebService介面

繁華似錦Fighting發表於2021-07-03

因為我之前對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: "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介面

  1. 詢問開發可知。
  2. 通過地址檢視可知。如果介面URL地址最後有WSDL,表示該介面為WebService介面。
  3. 通過瀏覽器展示的資訊可知。在瀏覽器中訪問該介面URL地址,如果返回如下圖所示的內容,說明該介面就是一個WebService介面。
    image

(2)如何獲取WebService介面相關資訊

  1. 檢視介面文件(上上策)。
  2. 通過瀏覽器展示的資訊可知。
  3. 通過工具檢視可知(這裡推薦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介面內容,可以獲取到介面的地址,介面的個數,和介面的引數。

上面訪問的地址解析後,如下圖所示:

image

說明:我們要查詢天氣,就需要呼叫getSupportCity方法,後邊紅框中就是請求中的內容。

5、使用JMeter測試WebService介面示例

查詢天氣的WebService服務的WSDL文件訪問地址:http://www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl

(1)測試計劃內包含的元件

新增元件操作步驟

  1. 建立測試計劃。
  2. 建立執行緒組:選中“測試計劃”右鍵 —> 新增 —> 執行緒(使用者) —> 執行緒組
  3. 線上程組中,新增配置元件HTTP資訊頭管理器元件:選中“執行緒組”右鍵 —> 新增 —> 配置元件 —> HTTP資訊頭管理器
  4. 線上程組中,新增取樣器“HTTP請求”元件:選中“執行緒組”右鍵 —> 新增 —> 取樣器 —> HTTP請求
  5. 線上程組中,新增監聽器“察看結果樹”元件:選中“執行緒組”右鍵 —> 新增 —> 監聽器 —> 察看結果樹

最終測試計劃中的元件如下:

image

點選執行按鈕,會提示你先儲存該指令碼,指令碼儲存完成後會直接自動執行該指令碼。

(2)HTTP資訊頭管理器內容

前面說過SOAP傳輸協議是一種封裝的HTTP中的POST請求,並且請求頭屬性Content-type設定為text/xml的時候,任何資料都可以XML化。

所需我們需要在請求的請求頭資訊中,新增Content-type=text/xml

如下圖所示:

image

(3)HTTP請求介面內容

在JMeter中,並沒有傳送SOAP請求的取樣器,又因為SOAP傳輸協議是一種封裝的HTTP中的POST請求,所示我們建立一個HTTP請求取樣器,來傳送SOAP請求即可。(請求方式POST)

編輯完的介面內容如下:

image

說明

  1. 介面基本資訊部分,就是分解這個http://www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl地址。
  2. 而請求傳送的引數,就是上面用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)執行檢視結果

結果如下圖所示:

image

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

image

這就說明我們使用JMeter訪問WebService介面成功了。

參考:

相關文章