前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python接口测试之requests中session会话对象(十八)

Python接口测试之requests中session会话对象(十八)

作者头像
无涯WuYa
发布2018-10-25 15:59:08
6.2K1
发布2018-10-25 15:59:08
举报
文章被收录于专栏:Python自动化测试

Python接口测试之requests(七)中介绍了requests的库,但是并没有没有介绍到session会话对象这部分,下面还是通过一个实际的案例来看这部分的在企业级产品中的应用。

登录一个系统,使用charles进行争包,见如下抓包获取的信息,见截图:

在如上的截图中,我们首先需要登录,登录成功后,可以获取XX的信息,见login接口响应恢复内容:

代码语言:javascript
复制
{
   "code": 200
}

在如上中可以看到,登录只返回了code是200,并没有期待中的返回token,那么可以得知该系统使用的是session的方式来记住用户登录后的密钥,也就是说,执行login的接口后,首先需要到sessionID,在下一个接口请求中带上login返回的sessionID,否则执行就会出现401无权限的问题,那么我们先来执行login的接口,见实现的代码:

代码语言:javascript
复制
#!/usr/bin/env python 
#-*-coding:utf-8-*-

import  requests

def login():
   '''登录接口:/auth/login'''
   r=requests.post(
      url='http://11X.39.63.XX:20080/auth/login',
      data={'username':'system','password':'123456'})
   print r.status_code
   print r.text

调用login的函数,见执行后输出的结果信息:

代码语言:javascript
复制
200
{
  "code": 200
}

那么我们接着来进行另外一个接口的调用,来获取XX信息,见该接口的代码:

代码语言:javascript
复制
#!/usr/bin/env python 
#-*-coding:utf-8-*-

import  requests

def selectable():
   r=requests.get(
      url='http://11X.39.63.XX:20080/depot/parks/selectable')
   print r.status_code
   print r.text

执行如上的方法后,并没有打印出所期望的信息,而是打印出需要登录该系统的信息,只所以出现该错误这是因为在该接口请求的时候系统并没有登录,所以第一步首先需要登录然后才可以发送该请求,那么就需要我们对login()的接口进行修改,获取到登录成功后的sessionID,并且selectable()接口请求的时候需要带上该接口,见修改后的代码:

代码语言:javascript
复制
#!/usr/bin/env python 
#-*-coding:utf-8-*-

import  requests

def login():
   '''登录接口:/auth/login'''
   r=requests.post(
      url='http://11X.39.63.XX:20080/auth/login',
      data={'username':'system','password':'123456'})
   return r.cookies.get_dict()

def selectable():
   r=requests.get(
      url='http://11X.39.63.XX:20080/depot/parks/selectable',cookies=login())
   print r.status_code
   print r.text

selectable()

在如上的例子中我们可以看到,首先需要获取到sessionID然后再另外一个接口请求中需要带上,这样其实存在很多的缺点的,最主要的缺点是当接口用例很多的时候,都需要带上那么就意味着每调用一个接口都得必须执行login()的函数,下来我们使用另外一种方式,也就是requests的session会话对象来进行处理。会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。对代码进行修改,见修改后的代码:

代码语言:javascript
复制
#!/usr/bin/env python
#-*-coding:utf-8-*-

import  requests

def login():
   '''登录接口:/auth/login'''
   s=requests.Session()
   r=s.post(
      url='http://11X.39.63.XX:20080/auth/login',
      data={'username':'system','password':'123456'})
   return s

def selectable():
   r=login().get(
      url='http://11X.39.63.XX:20080/depot/parks/selectable')
   print r.status_code
   print r.text

selectable()

再次执行如上的代码,见执行后的打印内容:

代码语言:javascript
复制
200
{
  "data": [
    {
      "Text": "\u65b0\u957f\u5b89\u5e7f\u573a\u9053\u8fb9\u505c\u8f66", 
      "Value": 1
    }
  ]
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档