一、cookie,session,token
1、cookie
- http是无状态的,没有记性
- cookie是让服务器记住你,
- cookie是保存在浏览器中,是浏览器的一套机制
-
浏览器cookie机制将cookie与域名,ip绑定在一起,当发送域名请求的时候,
浏览器就会去查找与域名绑定在一起的cookie信息,将该信息一起发给服务器,
服务器拿到后与服务器端保存的session信息进行校验 - cookie可以存储任意的信息,不一定是用户信息
2、session
- http协议的规定
- 在服务器记住用户信息状态,验证
- session相关信息会存储在redis数据库(redis数据库:键/值对)
- 服务器校验session:服务器返回session信息放到Headers中的Set-Cookie中,要客户端将session信息保存到cookie,客户下次发起请求的时候以cookie的形式再将session内容传回服务器,服务器将传回来的session值进行解密,校验用户信息以及时效是否正确
3、token
- 令牌,跨平台,一种权限,需要获取数据就需要token。比如12306购票系统,你需要先登陆,才能够买票,即,1、先需要访问登录接口;2、服务器等到用户信息,服务器根据用户信息生成token,并将token返回给客户端;3、客户端拿到用户身份token后,将token传入请求中,访问其他接口,获得相应接口数据
- token一般是不需要保存的
- token是开发定义的,token是用户信息+时间戳进行加密的值
- token的鉴权:验证token的正确性,将传入的token解密后获取用户信息,校验用户是否存在;验证token的时效性,将传入的token解密后获取token的开始时间,将当前时间戳减去开始时间,时间小于过期时间,token就有效,反之失效
4、三者之间的区别
1)token VS session
token是开发定义的,session是http协议规定的,token灵活性就强些
token一般不需要存储(客户端获取后,到下一个接口使用时传入,中间无需存储),但session需要存储
token可以跨平台(可以在pc、电视盒子上使用,也可以在手机端使用同一个token获取数据),
但session不能跨平台,因为cookie是和域名,ip绑定在一起的
2)cookie VS session
存储的都是同一个用户的信息
唯一的区别就是:cookie是存储在浏览器(客户端),session是存储在服务器端
二、requests库
1、安装:pip install requests
2、是python用来发送http请求的第三方库
3、Requests提供了很多功能特性,几乎涵盖了当今web服务的需求:
浏览器式的ssl验证
身份认证
keep-Alive & 连接池
流下载
文件分块上传
4、HTTP请求
1)GET请求
发送get请求
不带参数:res = requests.get(url)
带参数:res=requests.get(url,params)
带cookie:res=requests.get(url,params,cookies=res.cookies)
带请求头:headers={'User-Agent':'Mozilla/5.0'} res=requests.get(url,param,headers=headers)
获取请求头:res.request.headers
获取响应头:res.headers
获取响应状态码:res.status_code
获取cookie:res.cookies
获取响应数据:
res.json():返回的是json
res.text:返回的是文本(字符串)服务器返回的数据格式是HTML、XML,都可以用res.text接收
res.content:返回的是二进制数据,当返回的数据为图片、视频的时候,可使用res.content接收;不管你返回的是文本格式,json数据、图片还是视频,最开始的都是使用res.content接收的,都是二进制数据,输出的数据中b代表bytes;content方法中encoding编码:通过编码就是把二进制数据编码成人可以看懂的东西
参数传递:url参数、query string查询字符串、通过body传参,服务收不到,传不到服务器
准备参数:url、参数、请求头
2) POST
发送post请求
不带请求参数:res=requests.post(url)
带请求参数:param={'mobilephone':'13500000000','password':'123456'} res=requests.post(url,json=param)
获得响应数据:
res.json()获得json格式的返回数据
参数传递:
a、json格式数据,请求头部content-type=application/json,服务器才能接收到json数据,否则服务器接收不到请求数据
b、form格式的数据,请求头部content-type=multipart/form-data,服务器才能接收到form表单的数据,否则服务器接收不到请求数据
requests.post(url,headers=headers,data=data)在请求方法里面想传入form表单使用data=a,form表单参数的格式:a= {'age':18}
c、query string:查询字符串 url后?参数
d、xml格式数据:请求头部content-type=application/xml,服务器才能接收到xml的数据,否则服务器接收不到请求数据
总结一句话:当content-type和数据格式不匹配,后端服务器是可以接收到的,但是开发写的代码不一定会获取到做处理,
对于一个项目来说:到底用form-data,还是用json传递数据,由开发说了算
3)通用方法:request
request方法是自动测试用的最多的方法
import requests
url=""
headers = {}
param = {}
data = {}/json = {}
method = "get"/"post"/"put"/"delete"...
resp = requests.request(method,url,data=data,json=json,**kwargs)
为什么通用函数用的多?而不用get,post方法
原因:每个接口的方法可能不一样,我们可以把测试数据分离,将method放入到测试用例数据中,这样就可以做数据驱动测试
数据驱动测试的前提:测试用例数据用的函数的逻辑是一样的
4)工具---调试接口所用的地址:http://httpbin.org/
get请求地址:http://httpbin.org/get
post请求地址:http//httpbin.org/post