python中requests模块所有方法(Python接口测试之requests中session会话对象)(1)

requests中Session会话对象在企业级产品中的应用方案。

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

python中requests模块所有方法(Python接口测试之requests中session会话对象)(2)

在如上的截图中,我们首先需要登录,登录成功后,可以获取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.textselectable()

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

200

{

"data": [

{

"Text": "\u65b0\u957f\u5b89\u5e7f\u573a\u9053\u8fb9\u505c\u8f66",

"Value": 1

}

]

}

,