一、接口概念:传递数据的通道
二、鉴权
2.1、概念:验证用户是否拥有访问系统的权利
2.2、session(放到cookie中)(会占用服务器资源)
2.2.1、session注册鉴权流程
1)浏览器:我要注册
2)提交用户名,密码
3)服务器:数据库无该用户,允许注册,接口处理注册请求,存储用户名和密码到数据库(密码会加密存储)
4)注册成功
2.2.2、session登录鉴权流程
1)浏览器:我要登录
2)提交用户名,密码
3)服务器:数据库有该用户,校验密码(拿到密码加密计算然后与数据库对比),密码正确
4)服务器:创建一个session对象,一般存储在数据库或内存里,把session_id通过响应头Set-cookie字段返回给客户端
5)浏览器:登录成功从响应头取出Set-cookie字段,设置到下一个接口的请求头当Set-cookie字段中
6)浏览器:请求其他接口
7)提交请求参数,Set-cookie会自动携带
8)服务器:收到请求,从请求报文请求头中获取Cookie,获取session_id与数据库存储的session_id对比,对比一致就处理请求
9)返回响应数据
2.3、token(每次登录时的token不同)
2.3.1、Token鉴权流程
1)浏览器:我要登录
2)提交用户名,密码
3)服务器:验证用户名和密码,根据特定算法生成token,token生成:签名(请求参数排序+用户id+时间戳)
4)token返回给浏览器
5)浏览器:获取后端返回的token,保存token请求头中
6)浏览器:请求其他接口,携带包含token的请求头
7)提交请求参数,携带token
8)服务器:收到请求,从请求报文请求头中获取token,解析出用户id,与时间戳,user_agent信息
9)服务器:通过用户id匹配用户,通过时间戳判断token是否失效,通过user_agent信息判断是否是冒用用户
10)鉴权通过后,响应数据;鉴权不通过,拦截
三、requests(详见:http://testingpai.com/article/1615615517987)
3.1、安装
pip install requests
3.2、使用
3.2.1、HTTP请求方法:requests都支持
3.2.2、get请求
参数传递方式:
1、放在接口地址后面
import requests import pprint
url='http://httpbin.org/get?key1=val&key2=val2' res=requests.get(url=url) pprint.pprint(res.json())
2、通过params参数来接收
import requests import pprint
url = 'http://httpbin.org/get' data = {'key1':'val','key2':'val2'} res = requests.get(url=url,params=data) pprint.pprint(res.json())
3.2.3、post请求
1、data参数:默认使用'Content-Type': 'application/x-www-form-urlencoded'类型
import requests import pprint
url = 'http://httpbin.org/post' data = {'key1':'val','key2':'val2'} res = requests.post(url=url,data=data) #url:接口地址, data=None:请求参数(默认是application/x-wwww-form-urlencode) pprint.pprint(res.json())
2、json参数:默认使用'Content-Type': 'application/json'类型
import requests import pprint
url = 'http://httpbin.org/post' data = {'key1':'val','key2':'val2'} re=requests.post(url=url,json=data) #url:接口地址,json=None:请求参数(默认是application/json) pprint.pprint(re.json())
3、不定长参数:请求头指定了Content-Type类型,不管使用data还是json参数,都会使用headers指定的类型
import requests import pprint
header = {'Content-Type': 'application/json'} url = 'http://httpbin.org/post' data = {'key1':'val','key2':'val2'} res = requests.post(url=url,data=data,headers=header) #**kwargs不定长参数,可以自定义参数 pprint.pprint(res.json())
3.2.4、patch请求:请求数据时只需要请求第一个数据
3.2.5、put请求:请求数据时需要请求所有数据
3.3、接口测试要素
1、url地址
2、请求参数
3、请求方法
3.4、获取请求/响应数据
1、获取请求头:请求数据.request.headers
print('获取请求头信息:',reponse.request.headers)
2、获取响应体:请求数据.json()
print('获取响应体信息:',reponse.json())
3、获取响应头信息:请求数据.headers
print('获取响应头信息:',reponse.headers)
4、获取cookie信息:请求数据.cookies
print('获取cookie信息:',reponse.cookies)
5、获取响应状态码:请求数据.status_code
print('获取响应状态码:',reponse.status_code)
3.5、session鉴权
1、手动获取:先手动取出响应头中的session_id,再将session_id放到下一个请求接口的请求参数中
import pprint import requests login_url = 'https://test.emooc.com:6/public/login' login_data={'loginAccount':'yangdi', 'password': 'Ynp0QDE0MDQ=', 'areaCode': 10, 'captchaCode': '', 'deviceType': '10', 'isAjax': 'true' } res=requests.post(url=login_url,data=login_data) pprint.pprint(res.json()) #获取响应体 cookie=res.headers['_sessionid4pad_'] #获取响应头,从响应头中取出session_id(根据实际接口的字段取值) list_url='https://test.emooc.com:6/login/user' list_data={'isAjax':'true'} list_res=requests.post(url=list_url,data=list_data,headers={'_sessionid4pad_':cookie}) #将取出的session_id放到下一个接口请求参数中(根据实际接口的字段赋值) pprint.pprint(list_res.json())
2、自动获取:用requests的session方法创建一个session对象,session_id会自动保存到session对象中,每次发送请求时带着创建的session对象发送请求
import pprint import requests
login_url = 'https://test.emooc.com:6/public/login' login_data={'loginAccount':'yangdi', 'password': 'Ynp0QDE0MDQ=', 'areaCode': 10, 'captchaCode': '', 'deviceType': '10', 'isAjax': 'true' } session=requests.session() #用requests的session方法创建一个session对象,session_id会自动保存到session对象中 res=session.post(url=login_url,data=login_data) #带着创建的session对象去发送请求 pprint.pprint(res.json()) #获取响应体 list_url='https://test.emooc.com:6/login/user' list_data={'isAjax':'true'} list_res=session.post(url=list_url,data=list_data) #带着创建的session对象去发送请求 pprint.pprint(list_res.json()) #获取响应体
3.5、token鉴权:只能手动获取,先手动获取响应体中的token,再将token放到下一个接口请求的参数中
import requests import time login_url = 'https://openapiv5.ketangpai.com/UserApi/login' login_data = {"email":"1605118090@qq.com", "password":"Aa123456", "remember":"0", "code":"", "mobile":"", "type":"login", "reqtimestamp":int(time.time()*1000)} #时间戳,实时取,因为收到的那个时间戳是13位的,但获取到是10位的,所有要*1000,在int一下取整 reponse=requests.post(url=login_url,json=login_data) print(reponse.json()) token=reponse.json()['data']['token'] #获取响应体里data里的token user_url = 'https://openapiv5.ketangpai.com/UserApi/getUserBasinInfo' user_data = {"reqtimestamp":int(time.time()*1000)} #请求参数 user_reponse=requests.post(url=user_url,json=user_data,headers={'token':token}) #查看token传递方法,所以用'token':token,根据项目实际情况,可能传的不是token print(user_reponse.json())
3.6、时间戳的处理方式
import time
print(time.time()) #实时取,获取到的是10位的1656083631.65472