作者 无涯
在Python接口测试之requests(七)中介绍了requests的库,但是并没有没有介绍到session会话对象这部分,
下面还是通过一个实际的案例来看这部分的在企业级产品中的应用。
登录一个系统,使用charles进行争包,见如下抓包获取的信息,见截图:
在如上的截图中,我们首先需要登录,登录成功后,可以获取XX的信息,见login接口响应恢复内容:
{
"code": 200
}
在如上中可以看到,登录只返回了code是200,并没有期待中的返回token,那么可以得知该系统使用的是session的方式来记住用户登录后的密钥,
也就是说,执行login的接口后,首先需要到sessionID,在下一个接口请求中带上login返回的sessionID,否则执行就会出现401无权限的问题,那么
我们先来执行login的接口,见实现的代码:
#!/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的函数,见执行后输出的结果信息:
200
{
"code": 200
}
那么我们接着来进行另外一个接口的调用,来获取XX信息,见该接口的代码:
#!/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()接口请求
的时候需要带上该接口,见修改后的代码:
#!/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 连接将会被重用,
从而带来显著的性能提升。对代码进行修改,见修改后的代码:
#!/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() 再次执行如上的代码,见执行后的打印内容: 200 { "data": [ { "Text": "\u65b0\u957f\u5b89\u5e7f\u573a\u9053\u8fb9\u505c\u8f66", "Value": 1 } ] }