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

因為我之前對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接口

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

(2)如何獲取WebService接口相關信息

  1. 查看接口文檔(上上策)。
  2. 通過瀏覽器展示的信息可知。
  3. 通過工具查看可知(這裡推薦SoapUI工具)。

如果我們要調用遠程的WebService接口,就必定要告訴對方,我們要調用的是一個什麼方法,以及這個方法的參數的值等等。

我們以一個查詢城市天氣預報的地址//www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl為例,訪問這個接口,我們就可以看到這個接口下有什麼方法和參數。

1)訪問WebService接口的地址

就是上面的地址,//www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl

2)如何獲取請求參數

也就是如何表示數據,用什麼格式去表示函數以及它的參數。

我經常使用SoapUI工具來解析WebService接口內容,可以獲取到接口的地址,接口的個數,和接口的參數。

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

image

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

5、使用JMeter測試WebService接口示例

查詢天氣的WebService服務的WSDL文檔訪問地址://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. 接口基本信息部分,就是分解這個//www.webxml.com.cn/webServices/WeatherWebservice.asmx?wsdl地址。
  2. 而請求發送的參數,就是上面用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)運行查看結果

結果如下圖所示:

image

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

image

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

參考: