python代码学习——接口自动化一(接口基础与requests)
接口基础知识
- 接口在广义上可以分为内部接口和外部接口,内部接口指的是公司内部的接口,例如登录;外部接口指的是调用第三方的接口,例如获取验证码、支付等等
- 按照不同的请求协议,分为http、webservice、dubbo、socket,如何得知公司产品的协议?答案:问开发
- 接口的本质:调用类里面的方法
- http协议请求分为get、post、delete、head、optioon
- webservice:经过封装的post请求
http请求
- 一个http请求包括:head信息、响应信息、cookies、html、缓存
- 请求头:注意user_Agent信息,它代表从那个客户端发过去的,例如域名
- 请求头信息并不是每一次请求都要,但是如果请求中必须要请求头(headers),那么必须要加
- 请求头跟随requesr中的hearers参数,以字典/json的形式发送
- url:请求地址
- get/post: 请求方法
- 响应头:服务器返回回来的数据,一般是json
http常见的状态码
- 200 :正常,一切正常,服务器接收请求也作出了正确的处理
- 404:找不到,服务器不存在客户机所请求的资源
- 502:网官错误,一般由服务器重启导致
- 504:超时
- 403:禁止 服务器理解客户请求,但是拒绝处理,通常由服务器上的文件或目录的权限导致
- 304:未修改:表示客户机器缓存的版本是最新的,应该继续使用他(具体说直接取缓存的数据),比如说前端js,主要指的是静态资源
- 302:临时重定向:请求地址的文档被移动或者删除,文档新的url在location响应头中给出
- 500:服务器内部程序出现错误
cookies与session
- cookies:在客户端村存储用户的一些数据,例如用户名或浏览器记录
- seeeion:在服务器及用户的请求状态,一般默认时间是30min,超时重新登录,有session决定。一般以session_id的形式呈现出来
- 机制:session_id会记录在cookies中,每次请求,cookies的所有信息都会传给服务器,服务器通过session_id来识别是否是同一个用户的请求,不是一个用户的话,会要求用户重新登录
- 这种机制的原因:http请求是无状态的、无标记的
- session存在过期,cookies没有过期
访问授权与鉴权
- 鉴权:访问的接口是否正常,是否非法访问,越过前端访问,token
- 授权:是否只有访问接口的权限 ,常出现在加密的或者收费的第三方接口,并不是任何人都可以访问的,如果要正常访问,必须要传key,一般来说是唯一的、全局的、动态的,具有一定的特征
- 验签,常出现在app或SDK的应用中,参靠以下网址:https://blog.csdn.net/sjy8207380/article/details/79232644
- jemeter和soapUI的使用方法:
如何用python做接口测试
- 利用python去发起http请求
- 可利用urlib、urlib2、requests模块都可实现利用python发起http请求
- 在此只讲解requests模块
- 首先安装requests第三方库
- 导入requests模块
- 如果遇到接口不会处理怎么办?http://docs.python-requests.org/zh_CN/latest/
Requests模块
- 通过代码发起的请求与通过网站/app/接口测试工具发起的请求是一样的,都是从客户端发起
- requests 的简单使用样例
import requests
url = 'https://xgsj.istarshine.com/login'
data = requests.get(url)
print(data)
Get请求
- requests中的get模块,就是一个函数
- 存在return的返回值,返回的是一个对象,可用变量来接受存储这个值,打印结果如下:
- get中存在三个参数,url、param和**kwargs;其中param存在默认参数None
- url指的是数据地址,param指的是数据发送的格式,**kwargs指的是请求的时候带的参数
- get返回的是一个request请求函数
- 以下是get函数的的代码详情
request 请求函数
- request 中存在method、url和 **kwargs(关键字参数,不传入也可以)三个参数
- 其中method指的是请求方式,url指的是请求地址,**kwargs是关键字参数默契意味着参数会以键值对的形式传入
- 其中的关键字参数必须传requeat指定的那些参数,例如:method、url、data、json、params、headers、cookies、files、proxies(代理)、auth、time-out、verify、class、request等等
- requeats支持的请求方式有许多种,`GET
, OPTIONS, HEAD, POST, PUT, PATCH, 和 DELETE .都是http请求的method,但是常用的是get和post请求
post请求
- 如果一个url,使用get请求返回200,使用post请求返回404,说明url不支持post请求
- post请求中存在url、data、json和关键字参数;url指的是请求地址;data和json是默认参数,含带默认值None;发送请求的数据一般有两种格式。如果数据是字典格式的,默认赋值给data。如果数据是json格式的,要用json=“”传给json。也就是说data = data;json=json
- 存在return返回值,返回值是兑现对象
requests模块的return返回
- 不论是get还是post,其请求的结果return返回的都是对象,是个响应实体
- 一个repose包含了响应头、响应正文和状态码
查看模块返回信息
- `使用headers来查看响应
- 使用text来查看正文
- 使用status_code来查看code码
import requests
url = 'http://www.lemfix.com/topic/25'
data_1 = requests.post(url)
print(data_1)
data_headers = data_1.headers
data_code = data_1.status_code
data_request_headers = data_1.request.headers
data_text = data_1.text
data_text = data_1.json()
print(data_headers)
int(data_code)
print(data_request_headers)
print(data_text)
查看cookies
- 如果接口文档中没有明确的规定说,请求是json格式的,那么请求都是放在字典中的
- cookies,向服务器表名请求是同一个账号发的
- 一般来说,登录成功后会存在cookies
- cookies的获取方式:直接用return返回值.cookies即可;因没有合适的网站,在此不做样例展示
- cookies其实是一种 类字典的形式,可以用字典取值的方式进行取值
import requests
login='http://47.107.168.87:8080/futureloan/mvc/api/member/login'
login_data={'mobilephone':18688773467,'pwd':'123456'}
res = requests.post(url=login,data=login_data)
res_meg = res.text
cookies_mes = res.cookies
print(cookies_mes)
print(res_meg)
注意:
- 什么时候带cookies?答:如果这个请求需要在用户登录成功之后操作,就需要带cookies
- text和json都能够获取结果,用哪个比较好?答:如果要取值的话,建议使用字典
- 用户登录成功后带cookies的才能操作的请求,有另外一种方式来解决吗?答:可以使用session来解决,解决方式如下,仅供参考:
import requests
login = 'http://47.107.168.87:8080/futureloan/mvc/api/member/login'
login_data = {'mobilephone': 18000000001, 'pwd': '123456'}
recharge = 'http://47.107.168.87:8080/futureloan/mvc/api/member/recharge'
recharge_data = {'mobilephone': 18000000001, 'amount': '1000'}
session_mes = requests.session()
res_login = session_mes.get(url= login,params=login_data)
res_recharge = session_mes.get(url= recharge,params=recharge_data)
print("登录结果",res_login)
print("充值结果",res_recharge)
将request写成一个类,支持两种请求
import requests
def http_request(url,param,mechod,cookie=None):
if mechod=='get':
res=requests.get(url,param,cookies=cookie)
else:
res=requests.post(url,param,cookies=cookie)
return res
if __name__=='__main':
login='http://47.107.168.87:8080/futureloan/mvc/api/member/login'
login_data={'mobilephone':18688773467,'pwd':'123456'}
recharge='http://47.107.168.87:8080/futureloan/mvc/api/member/recharge'
recharge_data={'mobilephone':18688773467,'amount':'1000'}
res_login=http_request(login,login_data,'get')
print('登录的结果是',res_login.json())
print('-'*50)
res_recharge=http_request(recharge,recharge_data,'post',cookie=res_login.cookies)
print('充值的结果是',res_recharge.json())
|