在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
}
]
}