python接口自动化中requests.session

一、作用:

在使用Python做接口自动化测试过程中,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息。
另外,大部分接口调用往往需要先进行登录操作,然后才能对相关的接口进行操作。

针对以上情形,通常我们会有两种做法

  • 1、每次接口请求后获取到响应中的cookie,然后接下来的所有请求带上这个cookie
  • 2、使用requests的session会话对象
    今天分享一下使用requests的session会话对象,保持登录状态,然后对接口进行操作的场景。

二、requests.session用法

1、基本用法

s = requests.session() 会实例化会话一个会话对象

  • 1、会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie
  • 2、会话对象具有主要的 Requests API 的所有方法。你可以当成 Request去使用
import requests

s = requests.session()  # 实例化会话对象

loginUrl = "https://q.test.dos.lixinchuxing.cn/auth/wxlogin"
data = {"username": "********", "password": "******"}
header = {"Content-Type": "application/json; charset=UTF-8"}
try:
    #进行登录
    res = s.post(url=loginUrl,json=data,headers=header, verify=False)
except Exception as e:
    print("登录异常".format(e))

#下面为需要共享cookie的请求,put或者get请求用s.put和s.post来进行发起,就会自动带上共享的cookie
testurl =  "https://XXXXXXXXX"
testdata = {}
res_test = s.get(url=testurl,data=data)
res_test2 = s.post(url=testurl,data=data)

2、通过设置session对象的属性来实现自定义请求方法的缺省数据

我们在测试中也会遇到这样一种情况,除了cookie之外,在请求时需要在header中加入额外的验证,这时我们可以用s.headers.update()方法,将其余请求方法中的headers属性合并起来作为最终的请求方法的headers

import requests

s = requests.session()  # 实例化会话对象

loginUrl = "https://q.XXX.dos.lixinchuxing.cn/XXXX/wxlogin"
data = {"username": "********", "password": "******"}
header = {"Content-Type": "application/json; charset=UTF-8"}
try:
    #进行登录
    res = s.post(url=loginUrl,json=data,headers=header, verify=False)
    #将X-CSRF-Token属性添加至session的header中,此后的请求请求头中会带上此属性
    s.headers.update = ({"X-CSRF-Token":token})
except Exception as e:
    print("登录异常".format(e))

三、完整代码

import requests
requests.packages.urllib3.disable_warnings()   #忽略警告

def login():
    s = requests.session()  # 实例化会话对象
    loginUrl = "https://q.XXX.dos.lixinchuxing.cn/XXXX/wxlogin"
    data = {"username": "********", "password": "******"}
    header = {"Content-Type": "application/json; charset=UTF-8"}
    try:
        res = s.post(
            url=loginUrl,
            json=data,
            headers=header, verify=False)
        print(res.cookies)
        # 后续接口请求在header中要增加"X-CSRF-Token"属性,值为登录请求获取到的csrf-token值
        token = res.cookies["csrf-token"]
        s.headers.update = ({"X-CSRF-Token":token})
        #返回登录处理后的session对象
        return s
    except Exception as e:
        print("登录异常".format(e))

# 第二次请求的url
Url2 = 'https://q.test.dos.lixinchuxing.cn/api/v1/****/****/*****/evaluation/car_info'
data={"is_from_car_manage": "false"}
# 请求接口
Res2 = login().put(url=Url2,dat=data)
print(Res2.text)

经验证,可以正常向需要首先登陆的接口发送请求