我们在使用接口请求时经常听到Cookie和Session的知识,那么它们的实际意义和使用场景在哪里呢 ?    介绍如下

一、首先需要了解的是为什么需要有Cookie和Session这两个东西:Http是无状态协议,Cookie和Session的引入就是为了进行状态管理。

  Cookie的产生:由服务端生成,存储在响应头中,返回给客户端,客户端会将cookie存储下来

  Session的产生:由服务端生成,存储在服务器端的内存、缓存、数据库等地方

二、服务请求的传递过程

  在客户端发送请求时,user-agent会自动获取本地存储的cookie,将cookie信息存储在请求头中,发送给服务端。

  那么问题就出现了,请求都是由客户端发起的,当服务端生成了session,客户端怎么会知道呢?客户端怎么能对上这个session暗号?

  整个传递过程如下:

  1、在客户端给服务端发送请求后,服务端会根据请求信息生成session,同时生成一个session_id,通过cookie返回给客户端

  2、客户端再次向服务端发送请求时,会通过cookie将这个session_id发送给服务端,这样就对上了session的暗号

验证程序代码如下:

# -*- coding: utf-8 -*-
import requests
# 登录数据
login_url='http://119.23.241.154:8080/futureloan/mvc/api/member/login'
login_data={'mobilephone':'','pwd':''}
# 充值数据
recharge_url = 'http://119.23.241.154:8080/futureloan/mvc/api/member/recharge'
recharge_data = {'mobilephone':'','amount':''} # -------------------------------------------以下是cookie的方式----------------------------------------------------
# 登录请求
response_log = requests.get(login_url, login_data)
res_login = response_log.json() # 返回结果转换json格式
cookies_log = response_log.cookies.get_dict() # 获取Cookie的字典格式
print('登录结果是{0}'.format(res_login))
print('登录产生的cookie是{0}'.format(cookies_log))
print('JSESSIONID:{0}'.format(cookies_log['JSESSIONID']))

运行结果如下:

1、登录成功后才会产生cookie

2、你要获取cookie就要从响应结果response里面去获取

3、cookie类似于字典格式,可以用key取value的值

然后第二个“充值”接口是需要依赖登陆cookie的,如果不传递cookie值结果如下

# -*- coding: utf-8 -*-
import requests
# 登录数据
login_url='http://119.23.241.154:8080/futureloan/mvc/api/member/login'
login_data={'mobilephone':'','pwd':''}
# 充值数据
recharge_url = 'http://119.23.241.154:8080/futureloan/mvc/api/member/recharge'
recharge_data = {'mobilephone':'','amount':''} # -------------------------------------------以下是cookie的方式----------------------------------------------------
# 登录请求
response_log = requests.get(login_url, login_data)
res_login = response_log.json() # 返回结果转换json格式
cookies_log = response_log.cookies.get_dict() # 获取Cookie的字典格式
# print('登录结果是{0}'.format(res_login))
# print('登录产生的cookie是{0}'.format(cookies_log))
# print('JSESSIONID:{0}'.format(cookies_log['JSESSIONID']))
# print('登录产生的cookie是{0}'.format(cookies_log.get_dict()))
# #1、登录成功后才会产生cookie 2、你要获取cookie就要从响应结果response里面去获取 3、cookie类似于字典格式,可以用key取value的值
#
# ==========充值请求==============
# # 如果不加cookie 会一直显示{'data': None, 'status': 0, 'code': None, 'msg': '抱歉,请先登录。'}
# res_recharge = requests.post(recharge_url, recharge_data, cookies=cookies_log).json() # cookies=cookies关键字参数 key=values,如果是headers就headers=values
res_recharge = requests.post(recharge_url, recharge_data).json() # 无cookie传递的情况 print('充值结果是{0}'.format(res_recharge))

结果如下 :

提示需要先登陆

加上cookie信息后(加cookie的方式参照我注释的倒数第三行),可以正常返回充值信息:

三、会话对象session

会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。

session会自动管理cookie,一个session对象会保持同一个会话中的所有请求之间的cookie信息

验证代码如下,当我们不实用cookie,直接使用session时也能保持登录

import requests
# 登录数据
login_url='http://119.23.241.154:8080/futureloan/mvc/api/member/login'
login_data={'mobilephone': '', 'pwd': ''}
# 充值数据
recharge_url = 'http://119.23.241.154:8080/futureloan/mvc/api/member/recharge'
recharge_data = {'mobilephone': '', 'amount': ''}
s = requests.session() # 产生一个会话,无直接进行cookie传递
res_login2 = s.get(login_url, params=login_data).json() # 登录在这个会话下发起get请求 get只能传一个参数, def get(self, url, **kwargs):
res_recharge2 = s.post(recharge_url, recharge_data).json() # 充值在这个会话下发起post请求
print('登录结果是{0}'.format(res_login2))
print('充值结果是{0}'.format(res_recharge2))

运行结果如下:

均能正常返回结果。

总结

1、状态处理:每次请求服务器都要校验你的状态 通过cookie seeion校验

2、cookie 存在本地

   seeion 存在服务器 会话的意思

3、每次提交请求的时候 会随带cookie 发送至服务器 检查会话是否已过期

4、当你在同一个会话下面 你可以直接请求

5、会话对象session比cookies更方便管理请求的cookie信息

最新文章

  1. SQL Server 简介
  2. VS 创建虚拟目录失败,映射到其他文件夹!
  3. VoxelGrid体素滤波器对点云进行下采样
  4. Rotate bitmap by real angle
  5. Django 应用 Buildbot
  6. Kinect帮助文档翻译之二 手势
  7. C/C++中浮点数格式学习——以IEEE75432位单精度为例
  8. ASP.NET MVC 中@html.ActionLink的几种参数格式
  9. 搭建Hadoop集群 (三)
  10. js事件汇总
  11. Caused by: java.net.SocketException: Software caused connection abort: socket write error
  12. input【type="checkbox"】标签与字体对齐
  13. 图片人脸检测——Dlib版(四)
  14. SpringMVC源码分析--容器初始化(三)HttpServletBean
  15. linux安装postgresql简洁版
  16. Python append()方法--list
  17. 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案)
  18. ecshop 订单状态
  19. My Apple Developer Library Catalog
  20. SVM中为何间隔边界的值为正负1

热门文章

  1. 网关never_host设计
  2. VsCode 常用快捷键、debug菜单、debug插件
  3. 基于STM32之UART串口通信协议(二)发送
  4. 基于STM32之UART串口通信协议(一)详解
  5. jquery.cookie.js 获取不到cookie的值
  6. java基础类型源码解析之HashMap
  7. POI 身份证号码 手机号 日期值的处理方式
  8. scrapy基础知识之 Logging:
  9. Appium+python自动化(十八)- 你难道是猴哥失散多年的混血弟弟还是妹妹???- Monkey事件(超详解)
  10. Java线程池源码及原理