接口和HTTP协议(二)

一、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

 

posted @ 2021-01-16 13:26  %女王%  阅读(103)  评论(0编辑  收藏  举报