自动化遇到webservice接口怎么办?
前言:
大家做接口自动化的时候,测的大多数接口都是基于http类型协议的,在python中使用requests去请求接口还是非常简单的。最近有部分小伙伴反映在工作中碰到了webservice的接口,webservice是基于soap协议的,表示不知道怎么用python去做自动化,其实不管什么类型的接口实现自动化的思路都是一样的,在接口请求上会有一些有区别。
SOAP协议其实就是在http协议的基础上,基于XML来进行数据传输的一种简易协议(大家可以自行扩展学习),在python2中有一个叫做suds的库,可以创建soap协议的客户端,用来请求webservice的接口,虽然python3中不再维护suds这个库了,但是python中依然维护了一些suds的分支,比如说suds-jurko、suds-py3等等。接下来就给大家详细的介绍一下如何使用suds-py3来请求webservice的接口
一、suds-py3安装
关于suds-py的安装,安装好python之后,直接在命令行使用pip进行安装就可以了。
-
安装命令
pip install suds-py3
-
suds-py3的官方文档: https://suds-py3.readthedocs.io/en/latest/
二、WSDL文档的介绍
WebService的接口是基于SOAP协议,每个服务地址都有一个对应WSDL文件,WSDL是一个遵循WSDL-XML模式的XML文挡,是用来精确描述Web服务的文档。一个WSDL文档通常包含8个重要的元素,即definitions、types、import、message、portType、operation、binding、service元素。这些元素嵌套在definitions元素中,如下案例所示:
WSDL文档中我们可以看到这个webservice的地址中提供了那些服务(接口),每个服务需要一些什么样的参数等等。和HTTP不同的是一个webservice地址中提供了多个服务(接口),我们要去使用那个服务(接口),调用对应的方法进行访问即可,关于WSDL文档如何去看大家也可以自行扩展学习这边不做过多的扩展,重点给大家介绍在python中如何去请求webservice接口。
三、suds的请求webservice
1、案例接口
为了方便大家学习,我边从网上找了2个webservice接口的url地址来给大家做案例演示:
-
QQ在线状态查询接口:http://ws.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl
-
参数:qq号码
-
返回:Y、N、E(Y代表在线、N代表离线、E代码参数有误!)
-
-
天气预报查询接口:http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
2、案列一
这边我们以qq登录状态查询这个服务地址为例,给大家来讲解;要知道一个webservice的地址中有多少个接口,我们可以直接浏览访问url地址看wsdl的描述文档,我们也可以借助于soapUI这个工具,当然我们也可以通过suds库创建一个客户端对象,访问该地址去看:
-
代码如下:
from suds import client
url = "http://ws.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"
# 访问url地址返回一个client对象
web_s = client.Client(url)
# 打印客户端对象,就可以看到该地址下所有的服务(接口)
print(web_s)
-
详细信息如下:
-
请求具体的某个接口
知道接口名和参数之后,我们就可以请求对应的接口了
from suds import client
url = "http://ws.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"
# 访问url地址返回一个client对象
web_s = client.Client(url)
# 准备参数,请求接口
res = web_s.service.qqCheckOnline(qqCode='121278987')
# 获取返回的结果:
print(res)
3、案例二
上面的qq状态查询是一个比较简单的案例,接口的请求参数和返回参数都比较简单,那么接下来看一个稍微复杂一点的接口,天气预报查询:
-
第一次请求
用上一个案例的代码,修改地址直接请求这个时候会出现报错:
from suds import client url = "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl" # 访问url地址返回一个client对象 web_s = client.Client(url) # 打印客户端对象,就可以看到该地址下所有的服务(接口) print(web_s)
-
运行错误:
上述代码报错的原因是因为,suds在解析返回来的WSDL的时候,发现返回的XML中的有些类型,不在标准的XML架构命名空间中,因此解析的时候报错了,这个时候我们需要加上如下几行代码,导入当前服务的命名空间
-
再次请求
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)
-
响应结果
打印连接的客户端可以看到,应该服务地址中有6个服务(接口),然后下面还有一些类型的介绍。如果要调用某个方法,就用客户端对象调用对应的方法即可。
4、自定义类型的请求参数
-
4.1、基本的字符串类型:
上面2个案例,接口的请求参数都是比较标准的字符串类型,调用的时候直接传入即可,有些服务的参数可能是服务命名空间中自定义的参数类型,那么调用相关服务之前就需要处理参数了
-
4.2、命名空间内自定义的参数类型
命名空间内自定义的参数类型,在调用相关方法之前,我们需要去获取参数类型的结构,然后按照结构构造参数
-
案例
下面是一个内部webservice地址(不对外开放),可以看到该服务下面有三个方法,每个方法中的请求参数都是命名空间内自定义的类型,如果说没有接口文档可以参考,我们如何知道这三个类型的参数应该传入什么呢?
4.3、参数类型的获取
-
-
我们以sendMCode这个方法为例,这个方法需要一个SendCodeParams类型的参数,我们要获取该类型参数的结构,我们可以直接创建一个该类型的对象,打印即可看到该参数的结构
from suds import client # 内部地址 url = 'http://127.0.0.1:8080/sms-service-war-1.0/ws/smsFacade.ws?wsdl' cli = client.Client(url) # 创建参数类型 params = cli.factory.create("ns0:sendCodeParams") # 打印参数 print(params)
运行结果:
运行上述代码,就可以看到sendCodeParams这个参数的结构,那么在请求该接口时,按照该格式去组织参数即可(其中有些是非必填参数,这边是看不出来的,需要参考接口文档),好了,关于webservice的接口请求就给大家介绍到这里,关于suds更多的使用方法,大家可以参考官方文档
欢迎来到testingpai.com!
注册 关于