因為我之前對
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介面
- 詢問開發可知。
- 通過地址檢視可知。如果介面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
介面成功了。
參考: