前言

在软件测试工作中,接口测试是一项非常重要的技能。相比于页面测试,接口测试执行速度更快、定位问题更准确,也更容易实现自动化。
对于测试工程师来说,Requests 是学习接口自动化测试时必须掌握的库。它能够帮助我们模拟客户端发送 HTTP 请求,并获取服务器返回的数据,从而验证接口功能是否符合预期
本文将通过实际案例介绍 Requests 的常见用法,并说明其在接口自动化测试中的应用。

一、什么是 Requests

Requests 是 Python 中最流行的 HTTP 请求库之一,其设计理念是:HTTP for Humans(为人类设计的 HTTP 库)

使用 Requests,我们可以轻松实现:

  • 发送 GET 请求
  • 发送 POST 请求
  • 提交表单数据
  • 发送 JSON 数据
  • 管理 Cookie 和 Session
  • 上传和下载文件
  • 获取接口返回结果

安装方式

命令⾏通过 pip⼯具 进⾏安装,命令:

pip install requests

检查安装是否成功

我们可以通过查看所有已经安装的库,来查看是否安装成功,命令:

pip list

成功⽰例:

在这里插入图片描述
安装完成后即可导入使用:

import requests

二、为什么接口自动化测试要学习 Requests

在实际项目中,一个完整的请求流程如下:

客户端 
	↓ 
发送HTTP请求
	↓
后端接口 
	↓ 
返回JSON数据 
	↓ 
客户端展示结果

接口自动化测试的本质就是:

  1. 发送请求
  2. 获取响应
  3. 校验结果

而 Requests 正是帮助我们完成第一步和第二步的重要工具


二、requests 模块使用

1. 第一个接口请求

⽰例:对百度接⼝发起请求

import requests

r = requests.get("https://www.baidu.com/")

print(type(r))

运行结果:

<class 'requests.models.Response'>

2. 介绍

requests.get ⽅法⽤于发送⼀个 HTTP请求 到指定的 URLrequests.get ⽅法返回⼀个 Response 对象,这个对象包含了服务器返回的所有信息,如:
在这里插入图片描述

Response 对象提供的属性/⽅法介绍:

属性/方法返回类型说明常见使用场景
r.status_codeint获取 HTTP 响应状态码,例如 200、404、500判断请求是否成功
r.textstr获取字符串形式的响应内容,自动根据编码进行解码查看接口返回内容、日志打印
r.json()dict / list将 JSON 格式响应解析为 Python 对象获取返回字段并进行断言
r.contentbytes获取字节形式的响应内容下载图片、文件、音频等二进制数据
r.headersdict获取响应头信息校验 Content-Type、Server 等信息
r.cookiesRequestsCookieJar获取服务器返回的 Cookie登录状态验证、会话管理
r.urlstr获取最终请求 URL(可能经过重定向)检查重定向后的访问地址
r.encodingstr获取或设置响应内容编码格式解决中文乱码问题
r.rawHTTPResponse获取原始响应对象,不做任何处理底层数据流处理(较少使用)
r.okbool状态码小于 400 返回 True快速判断请求是否成功
r.reasonstr返回状态码对应描述信息调试接口异常
r.elapsedtimedelta获取请求耗时接口性能验证
r.raise_for_status()None请求失败(4xx、5xx)时抛出异常异常处理、快速定位错误

使⽤⽰例:

# 响应状态码
print(r.status_code)
# 获取响应头信息
print(r.headers)

结果:

200
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Content-Encoding': 'gzip', 'Content-Length': '1145', 'Content-Type': 'text/html', 'Pragma': 'no-cache', 'Server': 'bfe', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Date': 'Sun, 31 May 2026 06:29:08 GMT'}

在这里插入图片描述

通过开发者工具,我们可以确认通过使用Response 对象,我们就基本上可以一一对应的得到真实响应结果
在这里插入图片描述

响应结果要对应

注意!! 否则就会报错

  • 如果响应结果 json 格式,必须以 json 格式打印
  • 如果响应结果 html 格式,必须以 text 打印

示例:对百度接⼝发起请求

  1. 通过开发者工具可以查看响应头信息
    在这里插入图片描述
  2. 也可以通过 r.headers 来获取响应头信息

示例:

r = requests.get("https://www.baidu.com/")
print(type(r))
# 获取响应头信息
print(r.headers)

结果:

{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Content-Encoding': 'gzip', 'Content-Length': '1145', 'Content-Type': 'text/html', 'Pragma': 'no-cache', 'Server': 'bfe', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Date': 'Sun, 31 May 2026 06:48:55 GMT'}

在这里插入图片描述

通过上述获取响应头信息,可知响应结果 html 格式,如果我们以 json 格式打印就会出现如下报错JSONDecodeError
在这里插入图片描述

3. 常⻅请求⽅法

查看 requests 源码可以看到,基本覆盖了所有的HTTP 请求方法,用于表示客户端希望对服务器资源执行什么操作
在这里插入图片描述
其中最常用的是getpostrequest请求方法

对于方法的认识,推荐你可以看我这篇文章《HTTP 协议基本格式与 Fiddler 抓包工具实战指南》

使⽤⽰例:

import requests

get_r = requests.get("https://www.baidu.com")
post_r = requests.post("https://www.baidu.com")


print("get:", get_r.status_code)
print("post:", post_r.status_code)

结果:

get: 200
post: 200

4. 添加请求信息

在使用 requests.get()requests.post() 等方法发送请求时,我们通常需要携带请求头请求参数Cookie 等信息。

实际上,get()post()put()delete() 等方法底层最终都会调用 request() 方法,因此它们支持的大部分参数是相同的。
在这里插入图片描述
常用参数说明:

参数类型说明常见场景
urlstr请求地址所有请求必须指定
paramsdictURL 查询参数GET 请求传参
datadict / str请求体数据表单提交
jsondictJSON 格式请求体RESTful API 接口
headersdict请求头信息Token认证、Content-Type设置
cookiesdictCookie信息登录状态保持
filesdict上传文件文件上传接口
authtupleHTTP认证信息Basic Auth认证
timeoutint / float请求超时时间防止接口长时间无响应
proxiesdict代理服务器配置抓包、代理访问
verifybool是否验证SSL证书HTTPS接口测试

如果直接使用 requests.request()方法发送请求时,注意加上mathod= [请求方法]参数来指定请求方法,请求方法大小写都可以

示例1:

req_r1 = requests.request(method="get", url="https://www.baidu.com")
req_r2 = requests.request(method="POST", url="https://www.baidu.com")
print("method_get:", req_r1.status_code)
print("method_post:", req_r2.status_code)

结果:

method_get: 200
method_post: 200

传参数选择 params、json 还是 data?

  • params 用于在URL中传递查询参数(Query Parameters),通常用于 GET 请求,但也可以用于其他类型的请求。

示例:请求抽奖页面奖品列表接口

url = "http://47.98.40.153:58080/prize/find-list"
# 定义请求参数
param={
    "currentPage":1,
    "pageSize":10,
}
# 定义请求头
header={
"Token":"eyJhbGciOiJIUzI1NiJ9.eyJpZGVudGl0eSI6IkFETUlOIiwiaWQiOjM5LCJpYXQiOjE3Nzk2MTEyNDYsImV4cCI6MTc3OTYxNDg0Nn0.XzWbJAmusdho1i23VipMur2pt4mCdSabG7blVJbT0o"
}
r = requests.request(method="GET",url=url,headers=header,params=param)
print(r.json())

实际发送的请求:

GET /activity/find-list?currentPage=1&pageSize=10 HTTP/1.1

最终 URL:

http://47.98.40.153:58080/activity/find-list?currentPage=1&pageSize=10
  • json 用于在请求体(Body)中传递 JSON 格式的数据,通常用于 POST 或 PUT 请求。

上传格式选择为 json 格式,Content-Type 会⾃动被设置为 application/json
在这里插入图片描述

示例2:请求抽奖页面用户登录接口

url = "http://47.98.40.153:58080/blogin.html"
# 定义请求头
header={
"Token":"eyJhbGciOiJIUzI1NiJ9.eyJpZGVudGl0eSI6IkFETUlOIiwiaWQiOjM5LCJpYXQiOjE3Nzk2MTEyNDYsImV4cCI6MTc3OTYxNDg0Nn0.XzWbJAmusdho1i23VipMur2pt4mCdSabG7blVJbT0o"
}
payload = {
    "username": "admin",
    "password": "123456"
}
r = requests.request(method="GET",url=url,json=payload,header=header)
print(r.json())

  • data 用于在请求体(Body)中传递表单数据,通常用于 POST 或 PUT 请求。

示例3:请求获得活动接口

import requests

header={
"Token":"eyJhbGciOiJIUzI1NiJ9.eyJpZGVudGl0eSI6IkFETUlOIiwiaWQiOjM5LCJpYXQiOjE3Nzk2MTEyNDYsImV4cCI6MTc3OTYxNDg0Nn0.XzWbJAmusdho1i23VipMur2pt4mCdSabG7blVJbT0o"
}
data = {
    {
  "activityName": "11",
  "description": "11",
  "activityPrizeList": [
    {
      "prizeId": 1790,
      "prizeAmount": 1,
      "prizeTiers": "FIRST_PRIZE"
    }
  ],
  "activityUserList": [
    {
      "userId": 3584,
      "userName": "sdf173f51"
    }
  ]
}
}

r =  requests.post(
    "http://47.98.40.153:58080/activity/create",
    data=data,
    header=header
)
print(r.json())
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐