你知道嗎?webservice的接口做自動(dòng)化,其實(shí)很簡(jiǎn)單!

大家做接口自動(dòng)化的時(shí)候,測(cè)的大多數(shù)接口都是基于 http 類型協(xié)議的,在 python 中使用 requests 去請(qǐng)求接口還是非常簡(jiǎn)單的。
最近有部分小伙伴反映在工作中碰到了 webservice 的接口,表示不知道怎么用 python 去做自動(dòng)化。
其實(shí)不管什么類型的接口實(shí)現(xiàn)自動(dòng)化的思路都是一樣的,在接口請(qǐng)求上會(huì)有一些有區(qū)別。
webservice 是基于 SOAP 協(xié)議的,SOAP 協(xié)議其實(shí)就是在 http 協(xié)議的基礎(chǔ)上,基于 XML 來進(jìn)行數(shù)據(jù)傳輸?shù)囊环N簡(jiǎn)易協(xié)議(大家可以自行擴(kuò)展學(xué)習(xí)),在 python2 中有一個(gè)叫做 suds 的庫(kù),可以創(chuàng)建 SOAP 協(xié)議的客戶端,用來請(qǐng)求 webservice 的接口。
雖然 python3 中不再維護(hù) suds 這個(gè)庫(kù)了,但是 python 中依然維護(hù)了一些 suds 的分支,比如說 suds-jurko、suds-py3 等等。接下來就給大家詳細(xì)的介紹一下如何使用 suds-py3 來請(qǐng)求 webservice 的接口。
suds-py3 安裝
關(guān)于 suds-py 的安裝,安裝好 python 之后,直接在命令行使用 pip 進(jìn)行安裝就可以了。
安裝命令
pip install suds-py3
suds-py3 的官方文檔:
?https://suds-py3.readthedocs.io/en/latest/
WSDL 文檔的介紹
WebService 的接口是基于 SOAP 協(xié)議,每個(gè)服務(wù)地址都有一個(gè)對(duì)應(yīng) WSDL 文件,WSDL 是一個(gè)遵循 WSDL-XML 模式的 XML文檔,是用來精確描述 Web 服務(wù)的文檔。
一個(gè) WSDL 文檔通常包含 8 個(gè)重要的元素,即 definitions、types、import、message、portType、operation、binding、service 元素。這些元素嵌套在 definitions 元素中,如下案例所示:

WSDL 文檔中我們可以看到這個(gè) webservice 的地址中提供了那些服務(wù)(接口),每個(gè)服務(wù)需要一些什么樣的參數(shù)等等。
和 HTTP 不同的是一個(gè) webservice 地址中提供了多個(gè)服務(wù)(接口),我們要去使用那個(gè)服務(wù)(接口),調(diào)用對(duì)應(yīng)的方法進(jìn)行訪問即可,關(guān)于 WSDL 文檔如何去看大家也可以自行擴(kuò)展學(xué)習(xí)這邊不做過多的擴(kuò)展,重點(diǎn)給大家介紹在 python 中如何去請(qǐng)求 webservice 接口。
suds 請(qǐng)求 webservice
1、案例接口
為了方便大家學(xué)習(xí),我從網(wǎng)上找了 2 個(gè) webservice 接口的 url 地址來給大家做案例演示:
QQ 在線狀態(tài)查詢接口:
http://ws.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl
參數(shù):QQ 號(hào)碼
返回:Y、N、E(Y 代表在線、N 代表離線、E 代碼參數(shù)有誤?。?/p>
天氣預(yù)報(bào)查詢接口:
http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
2、案例一
這邊我們以 QQ 登錄狀態(tài)查詢這個(gè)服務(wù)地址為例,給大家來講解;要知道一個(gè) webservice 的地址中有多少個(gè)接口,我們可以直接瀏覽訪問 url 地址看 wsdl 的描述文檔,我們也可以借助于 soapUI 這個(gè)工具,當(dāng)然我們也可以通過 suds 庫(kù)創(chuàng)建一個(gè)客戶端對(duì)象,訪問該地址去看:
代碼如下:
from?suds?import?client
url="http://ws.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"
# 訪問url地址返回一個(gè)client對(duì)象
web_s = client.Client(url)
# 打印客戶端對(duì)象,就可以看到該地址下所有的服務(wù)(接口)
print(web_s)
詳細(xì)信息如下:

請(qǐng)求具體的某個(gè)接口
知道接口名和參數(shù)之后,我們就可以請(qǐng)求對(duì)應(yīng)的接口
from?suds?import?client
url="http://ws.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"
# 訪問url地址返回一個(gè)client對(duì)象
web_s = client.Client(url)
# 準(zhǔn)備參數(shù),請(qǐng)求接口
res = web_s.service.qqCheckOnline(qqCode='121278987')
# 獲取返回的結(jié)果:
print(res)
3、案例二
上面的 QQ 狀態(tài)查詢是一個(gè)比較簡(jiǎn)單的案例,接口的請(qǐng)求參數(shù)和返回參數(shù)都比較簡(jiǎn)單,那么接下來看一個(gè)稍微復(fù)雜一點(diǎn)的接口,天氣預(yù)報(bào)查詢:
第一次請(qǐng)求
用上一個(gè)案例的代碼,修改地址直接請(qǐng)求這個(gè)時(shí)候會(huì)出現(xiàn)報(bào)錯(cuò):
from?suds?import?client
url="http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl"
# 訪問url地址返回一個(gè)client對(duì)象
web_s = client.Client(url)
# 打印客戶端對(duì)象,就可以看到該地址下所有的服務(wù)(接口)
print(web_s)
運(yùn)行錯(cuò)誤:

上述代碼報(bào)錯(cuò)的原因是因?yàn)?,suds 在解析返回來的 WSDL 的時(shí)候,發(fā)現(xiàn)返回的 XML 中的有些類型,不在標(biāo)準(zhǔn)的 XML 架構(gòu)命名空間中,因此解析的時(shí)候報(bào)錯(cuò)了,這個(gè)時(shí)候我們需要加上如下幾行代碼,導(dǎo)入當(dāng)前服務(wù)的命名空間

再次請(qǐng)求
from?suds?import?client
url="http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl"
from?suds.xsd.doctor?import?Import, ImportDoctor
imp=Import('http://www.w3.org/2001/XMLSchema',location='http://www.w3.org/2001/XMLSchema.xsd')
imp.filter.add('http://WebXml.com.cn/')
doctor=ImportDoctor(imp)
web_s = client.Client(url,doctor=doctor)
print(web_s)
響應(yīng)結(jié)果

打印連接的客戶端可以看到,應(yīng)該服務(wù)地址中有 6 個(gè)服務(wù)(接口),然后下面還有一些類型的介紹。如果要調(diào)用某個(gè)方法,就用客戶端對(duì)象調(diào)用對(duì)應(yīng)的方法即可。
4、自定義類型的請(qǐng)求參數(shù)
基本的字符串類型:
上面 2 個(gè)案例,接口的請(qǐng)求參數(shù)都是比較標(biāo)準(zhǔn)的字符串類型,調(diào)用的時(shí)候直接傳入即可,有些服務(wù)的參數(shù)可能是服務(wù)命名空間中自定義的參數(shù)類型,那么調(diào)用相關(guān)服務(wù)之前就需要處理參數(shù)了。
命名空間內(nèi)自定義的參數(shù)類型
命名空間內(nèi)自定義的參數(shù)類型,在調(diào)用相關(guān)方法之前,我們需要去獲取參數(shù)類型的結(jié)構(gòu),然后按照結(jié)構(gòu)構(gòu)造參數(shù)

參數(shù)類型的獲取
案例
# 內(nèi)部地址url =?'http://127.0.0.1:8080/sms-service-war-1.0/ws/smsFacade.ws?wsdl'cli = client.Client(url)# 創(chuàng)建參數(shù)類型params = cli.factory.create("ns0:sendCodeParams")# 打印參數(shù)
print(params)
上面是一個(gè)內(nèi)部 webservice 地址(不對(duì)外開放),可以看到該服務(wù)下面有三個(gè)方法,每個(gè)方法中的請(qǐng)求參數(shù)都是命名空間內(nèi)自定義的類型,如果說沒有接口文檔可以參考,我們?nèi)绾沃肋@三個(gè)類型的參數(shù)應(yīng)該傳入什么呢?
我們以 sendMCode 這個(gè)方法為例,這個(gè)方法需要一個(gè) SendCodeParams 類型的參數(shù),我們要獲取該類型參數(shù)的結(jié)構(gòu),我們可以直接創(chuàng)建一個(gè)該類型的對(duì)象,打印即可看到該參數(shù)的結(jié)構(gòu)
from?suds?import?client
運(yùn)行結(jié)果:

運(yùn)行上述代碼,就可以看到 sendCodeParams 這個(gè)參數(shù)的結(jié)構(gòu),那么在請(qǐng)求該接口時(shí),按照該格式去組織參數(shù)即可(其中有些是非必填參數(shù),這邊是看不出來的,需要參考接口文檔)。
好了,關(guān)于 webservice 的接口請(qǐng)求就給大家介紹到這里,關(guān)于 suds 更多的使用方法,大家可以參考官方文檔
聲明:本文為檸檬班木森老師原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處!