網站首頁 編程語言 正文
看過網上很多對Web Service的解釋,有些文章寫得通俗易懂,但是缺少深度解讀;有的文章圖文并茂,但是沒有現成案例;有的文章非常詳細,但是沒有直觀感受。
于是,我想從測試一個web service接口的角度,寫一篇比較系統的文章,來進一步認識web service。
Web Service服務是什么
首先要知道什么是Service,才能理解 Web Service。
服務(Service)是計算機提供的某種功能,在以前的計算機中,通常以后臺程序(Daemon)的形式存在。比如,在計算機中可以安裝MySQL服務,提供訪問數據庫的功能;在計算機中安裝SSH服務,提供遠程連接的功能。
服務可以分為兩種:本地服務和網絡服務。本地服務是在當前計算機上能訪問的服務,其他計算機無法訪問;網絡服務是在另一臺計算機上提供服務,其他計算機通過網絡連接訪問服務,網絡既可以是遠程的web服務,也可以是局域網服務。
舉個例子,我想做一個書籍閱讀的App,我已經把書籍的展示頁面,收藏書籍這些功能都實現了,但是我既不是寫作者,也不是出版社,我根本就沒有任何的新聞內容可以展示到 App 上。
我想了兩個辦法:第一個辦法就是把我現在已經有的書籍錄入到App中,用戶安裝我的App后,不需要聯網也是可以閱讀書籍的,我提供的書籍數據這種服務就是本地服務。
第二個辦法是我直接和出版社合作,直接通過出版社提供的網絡服務獲取書籍內容,我的App只負責展示,當用戶需要某本書籍時,通過訪問出版社提供的服務就能得到書籍內容。
這種通過網絡去獲取其他電子內容的服務就是Web Service。通過這種方式,我還可以實現服務聚合(Service Mashup),同時和多個出版社合作,我可以自己實現一套統一的 Web Service接口,對接不同的出版社內容。任何形式的網絡服務,不管返回HTML、JSON、XML還是圖片,都是Web Service。
Web Service原理
本質上來說,Web Service就是提供一個數據服務,而其他客戶端應用通過網絡來獲取數據,這些客戶端可以是瀏覽器,可以是手機App,可以是桌面應用,可以是電視盒子,可以是智能手表。
請求服務和響應服務的數據格式由雙方制定(實際上一般由服務方指定,客戶端按照要求操作),可以是 HTML,可以是 JSON,也可以是XML等其他格式。
實現Web Service的技術架構主要有兩種方式:
- REST,使用統一的無狀態操作集來表示web資源,目前的主要數據格式是JSON,但也可以使用XML。
- 非REST,服務可以不使用統一的指令集,進行任意的組合操作,比如RPC。
廣義上的 Web Service 幾乎包括了所有的網絡服務,而我們平時談論的Web Service,是特指 W3C 定義的概念。
A Web service is a software system designed to support interoperable machine-to-machine interaction over a network. It has an interface described in a machine-processable format (specifically WSDL). Other systems interact with the Web service in a manner prescribed by its description using SOAP messages, typically conveyed using HTTP with an XML serialization in conjunction with other Web-related standards.
概括下重點就是說:Web Service通過WSDL描述了一個網絡通訊接口,其他的系統可以使用SOAP協議和web service交互數據,SOAP基于HTTP實現,并且使用XML來組織數據。
有點難理解對不對,接下來我們一一解釋。
Web Service協議
接下來談論的Web Service都是指 W3C Web Service,不再是廣義上的。要理解這個定義,需要先弄清楚幾個概念:WSDL、SOAP、HTTP、XML。
WSDL文件詳解
WSDL 是Web Service 的接口文檔,和你在 Swagger 中看到的接口描述作用完全一樣。通過WSDL,客戶端知道該發送什么格式的請求數據,才能被服務正確解析。
WSDL(Web服務描述語言,Web Services Description Language)讀作wiz-d?l,用來描述Web服務的公共接口。它描述了如何調用服務,需要什么參數,以及返回什么數據結構,它的用途大致類似于編程語言中對接口(interface)的類型說明。
一個WSDL的描述一般類似這樣,實際編寫時一般不需要手工填寫,也不需要去深入看里面的構成,由工具生成就可以了。 在這個Demo網頁中可以看到更多示例,之后會有具體的案例說明。
<?xml version="1.0" encoding="UTF-8"?>
<description xmlns="http://www.w3.org/ns/wsdl"
xmlns:tns="http://www.tmsws.com/wsdl20sample"
xmlns:whttp="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:wsoap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://www.tmsws.com/wsdl20sample">
<documentation>
This is a sample WSDL 2.0 document.
</documentation>
<!-- Abstract type -->
<types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.tmsws.com/wsdl20sample"
targetNamespace="http://www.example.com/wsdl20sample">
<xs:element name="request"> ... </xs:element>
<xs:element name="response"> ... </xs:element>
</xs:schema>
</types>
<!-- Abstract interfaces -->
<interface name="Interface1">
<fault name="Error1" element="tns:response"/>
<operation name="Get" pattern="http://www.w3.org/ns/wsdl/in-out">
<input messageLabel="In" element="tns:request"/>
<output messageLabel="Out" element="tns:response"/>
</operation>
</interface>
<!-- Concrete Binding Over HTTP -->
<binding name="HttpBinding" interface="tns:Interface1"
type="http://www.w3.org/ns/wsdl/http">
<operation ref="tns:Get" whttp:method="GET"/>
</binding>
<!-- Concrete Binding with SOAP-->
<binding name="SoapBinding" interface="tns:Interface1"
type="http://www.w3.org/ns/wsdl/soap"
wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/"
wsoap:mepDefault="http://www.w3.org/2003/05/soap/mep/request-response">
<operation ref="tns:Get" />
</binding>
<!-- Web Service offering endpoints for both bindings-->
<service name="Service1" interface="tns:Interface1">
<endpoint name="HttpEndpoint"
binding="tns:HttpBinding"
address="http://www.example.com/rest/"/>
<endpoint name="SoapEndpoint"
binding="tns:SoapBinding"
address="http://www.example.com/soap/"/>
</service>
</description>
SOAP協議
SOAP 是一組標準的XML數據格式,通常在 HTTP 請求中傳遞。但其實除了HTTP以外,它也可以在SMTP、UDP、TCP等協議上傳輸,自然也可以用在web service上。也就是說,作為一種組裝數據的格式,它是獨立的。
看一個具體的例子,下面表示訪問 InStock
服務中的GetStockPrice
接口,并且傳遞參數 StockName
為 T。
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 299
SOAPAction: "http://www.w3.org/2003/05/soap-envelope"
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="http://www.example.org">
<soap:Header>
</soap:Header>
<soap:Body>
<m:GetStockPrice>
<m:StockName>T</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
從這個例子中可以看出,SOUP 消息內容是由 XML 編寫的,主要分為幾個部分:
- Envelope,將XML文檔標識為SOAP消息,必須
- Header,消息頭,可以不填。
- Body, 包含需要調用的接口,參數以及響應信息,必須。
- 還有一個 Fault,表示調用過程出錯后的展示信息。
Web Service接口測試
根據上面的內容,大致梳理了 WSDL、SOUP、XML和HTTP的關系。
現在可以開始測試web service服務了。
1、在瀏覽器中查看一個WSDL描述文件, 也可以訪問parasoft的示例網站獲取更多WSDL文件。
2、在chrome瀏覽器中安裝 Wizdler 插件或者 Boomerang,可以從WSDL中解析服務提供的接口,以及訪問接口需要填寫的參數類型。
3、點擊接口名稱,跳轉到測試頁面,修改請求參數。比如在 addInteger 接口中插入 12和13兩個參數。
4、點擊 Go 就可以往 Web Service 發送請求,得到響應結果。
Postman測試web service
使用Postman測試Web Service并無太大區別,還是讀取WSDL文件,從中解析出每個接口需要傳遞的參數格式。
- 在URL中填入服務地址
- 請求方法選擇POST請求
- 請求格式選在 application/xml
- 把WSDL生成的請求數據復制到body參數中
Python 測試 web service 接口
Python 測試 web service 接口和 postman 沒什么區別,只是把界面操作轉化成代碼。
- requests.post 可以直接發送 http 請求
- 準備好 SOUP 格式的請求體,傳入 data 參數
- 請求頭中把 content-type 修改成 appliction/xml
import requests
data = """\
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<getItemById xmlns="http://bookstore.parasoft.com/">
<id xmlns="">1</id>
</getItemById>
</Body>
</Envelope>
"""
url = 'https://parabank.parasoft.com/parabank/services/store-01'
headers = {'content-type': 'application/xml'}
resp = requests.post(url, data=data,)
print(resp.text)
Python 測試 web service 的終極方案
俗話說,有輪子就不要自己再造,Python之所以這么多人用就是生態完善,你能想到的場景基本都有現成的庫可以調用。而訪問 web service 接口可以使用 zeep 這個庫。
有了它之后,你只需要傳入 wsdl 文件或者url地址,zeep 會自動幫你解析。 你也不用再自己組裝 SOUP 數據,zeep 會幫你組裝。 訪問接口后的響應結果你也不用解析,zeep 幫你解析了。
import zeep
wsdl = 'https://parabank.parasoft.com/parabank/services/store-01?wsdl'
client = zeep.Client(wsdl=wsdl)
resp = client.service.getItemById(1)
print(resp['name'])
是不是很簡潔?現在我們就講這么多把,后面有時間再講一下 zeep 的系統用法。
原文鏈接:https://blog.csdn.net/looker53/article/details/125726906
相關推薦
- 2023-10-30 docker拉取鏡像時報錯Error response from daemon: Head ““no
- 2022-12-07 進程狀態ps?-ef中的e、f含義講解_linux shell
- 2022-07-13 Sybase使用Spring的只讀事物報 Use ‘set readonly off‘ to exe
- 2022-07-29 C++超詳細講解字符串類_C 語言
- 2021-10-13 linux環境下恢復rm誤刪的文件方法_Linux
- 2024-03-01 解決 “TypeError: Cannot read properties of undefined
- 2023-03-19 詳解OpenMP的線程同步機制_C 語言
- 2022-04-21 提升Python編碼能力的3個重要概念_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支