Requests

Requests 是一个用于发送 HTTP 请求的 Python 第三方库,专注于简洁性和易用性。它封装了底层的 http.client​ 模块,简化了 HTTP 请求操作,使开发者能以更直观的方式处理网络通信。

理论基础

API(应用程序接口)是不同软件系统之间交互的桥梁,允许不同的系统交换数据和服务。

API 自动化即接口自动化,主要针对前后端分离架构的项目。

前端和后端在开发和部署上是独立的,彼此通过 API 进行通信。

  • 前端:主要负责用户界面(UI)和用户体验(UX),通常使用框架如 Vue、React、Angular 等进行开发,直接与后端通过 API 进行数据交互。
  • 后端:负责处理业务逻辑、数据存储、身份验证等,通常使用如 Node.js、Spring Boot、Django 等后端技术,提供 RESTful 或 GraphQL API 给前端调用。

这种模式的好处包括:

  • 前端和后端可以独立开发、部署和扩展。
  • 前端可以选择不同的技术栈,而不依赖于后端的具体实现。
  • 后端通过 API 提供通用的数据服务,方便与不同的前端应用进行交互。

而 API 自动化测试则仅针对后端的接口进行测试,不关心任何前端的业务即流程。

常见的 API 类型:

  • REST API:基于 HTTP/HTTPS 协议,数据通常以 JSON 或 XML 格式传输。
  • GraphQL:一种新的 API 查询语言,允许客户端根据需求选择数据。
  • SOAP API:基于 XML 的 Web 服务。

市面上常见的 API 测试工具:

  • Postman:用于手动 API 测试的流行工具。你可以先使用 Postman 进行 API 请求,查看响应,进行断言,学习如何设置请求头、请求体等,国内平替如 ApipostApifox,推荐 Apipost,对国人更友好。
  • JMeter:用来做性能测试的工具,也能用来做 API 测试,适合负载和压力测试,需要 Java 8 以上版本的支持。
  • Fiddler:强大的 Web 调试代理工具,主要用于捕获、分析和调试 HTTP(S) 请求和响应。
  • Charles:功能强大的 HTTP 代理/抓包工具,广泛应用于 Web 开发、移动应用开发和调试等领域,与 Fiddler 类似。
  • Swagger:帮助生成 API 文档和测试接口,支持直接在界面中测试 API。
  • SoapUI:专门用于 SOAP 和 REST API 测试的工具。
  • Katalon Studio:一个集成自动化测试解决方案,支持 API 测试并提供可视化编辑功能。

除了常用的测试工具之外,还需要掌握一门编程语言,进行自动化测试脚本开发。

市面上常见的 自动化测试语言:

  • Python:学习如何用 Python 编写自动化测试脚本,如使用 Requestshttp.client 发送 HTTP 请求并验证响应。
  • Java:使用 RestAssured 或 JUnit 等库来进行 API 自动化测试。
  • JavaScript:如果你熟悉 JavaScript,可以使用 Mocha、Chai 和 Supertest 等框架进行 API 测试。
  • Ruby:使用 RSpec 和 HTTParty 进行 API 测试。

安装

pip install requests

使用

基本使用流程:

import requests

# 创建一个 session 会话,用于跨多个请求共享参数
session = requests.Session()

# 发送 GEt 请求
response = session.get("url")

# 查看响应
response.status_code # HTTP 状态码
response.json() # 返回 JSON 数据
response.text # 返回 响应文本

速查表

Session

Session​ 对象是 requests​ 库中用于跨多个请求保持参数的对象。它允许你跨多个请求共享一些配置,如 Cookie、Header、认证信息等。

常用方法

方法 描述
get(url, params=None, **kwargs) 发送 GET 请求,支持 URL 参数传递。
post(url, data=None, json=None, **kwargs) 发送 POST 请求,支持表单数据和 JSON 数据。
put(url, data=None, **kwargs) 发送 PUT 请求,用于更新资源。
delete(url, **kwargs) 发送 DELETE 请求,用于删除资源。
head(url, **kwargs) 发送 HEAD 请求,仅获取响应头,不包含响应体。
options(url, **kwargs) 发送 OPTIONS 请求,用于获取服务器支持的请求方法等信息。
patch(url, data=None, **kwargs) 发送 PATCH 请求,用于部分更新资源。
request(method, url, **kwargs) 发送指定 HTTP 方法的请求,是所有请求方法的底层实现。
close() 关闭当前会话,释放与之相关的所有资源。

常用属性

属性 描述
headers 当前会话的默认请求头,会自动添加到每个请求中。
cookies 当前会话的 Cookie 信息。
auth 设置身份验证信息。
proxies 设置当前会话的代理。
verify 是否验证 SSL 证书,默认为True​,可以设置为False​禁用 SSL 验证。
cert 设置客户端证书,用于 HTTPS 请求。
mount(prefix, adapter) 将自定义的适配器挂载到指定的 URL 前缀,用于高级应用(如使用不同的适配器处理 HTTP 和 HTTPS 请求)。

Response

Response​ 对象是 requests​ 库用来表示服务器返回的响应的对象,包含了请求响应的所有信息,如响应内容、状态码、头部信息等。

常用方法

方法 描述
json() 将响应体内容解析为 JSON 格式(如果响应内容是 JSON)。
text 获取响应体的字符串内容。
content 获取响应体的原始字节内容。
raise_for_status() 如果响应的状态码是 4xx 或 5xx,则抛出异常HTTPError​。
iter_content(chunk_size=1) 按块读取响应体内容(适用于下载大文件等)。
iter_lines(chunk_size=1, decode_unicode=False) 按行读取响应体内容。

常用属性

属性 描述
status_code HTTP 响应状态码(如 200、404、500 等)。
headers 响应头部信息,是一个字典,包含响应的各类头部信息(如Content-Type​、Content-Length​等)。
cookies 响应中的 Cookie 信息,返回一个RequestsCookieJar​对象。
url 响应的 URL,可能经过重定向后的最终 URL。
text 响应的内容,以 Unicode 字符串形式表示。
content 响应的内容,以字节串形式表示。
encoding 响应的编码方式,默认情况下会自动推测,但可以通过该属性手动设置。
history 访问历史,返回一个Response​对象列表,表示当前响应链中的所有响应。
reason 响应的描述信息,通常用于补充状态码的含义。

Request

Request​ 对象表示一个 HTTP 请求的原始数据,包括请求的方法、URL、头部信息、数据和其他配置项。虽然 requests​ 库通常自动构建和发送请求,但你也可以手动创建一个 Request​ 对象。

常用方法和属性

方法/属性 描述
prepare() Request​对象转换为一个可以发送的PreparedRequest​对象。
url 请求的 URL。
method 请求方法(如 GET、POST)。
headers 请求头部信息。
body 请求体内容,通常用于 POST 或 PUT 请求。
params 请求 URL 的参数。
cookies 请求的 Cookie 信息。

Cookies

Cookies​ 对象是一个字典,包含请求和响应中的所有 Cookie 信息。它是 requests​ 库内部使用的 RequestsCookieJar​ 对象,提供了对 Cookie 的操作接口。

常用方法和属性

方法/属性 描述
set() 设置 Cookie。
get() 获取 Cookie。
clear() 清除 Cookie。
items() 返回一个包含所有 Cookie 键值对的元组列表。

PreparedRequest

PreparedRequest​ 对象是 Request​ 对象经过 prepare()​ 方法处理后的对象,它可以直接用于发送 HTTP 请求。

常用方法和属性

方法/属性 描述
url 请求的完整 URL。
method 请求方法(GET、POST 等)。
headers 请求头部信息。
body 请求体内容。
cookies 请求的 Cookie 信息。

常用属性

参数 说明
params 用于传递查询参数(Query String),类型为字典或元组列表。
data 用于传递表单数据,类型为字典、元组列表或字符串。
json 用于传递 JSON 数据,类型为字典。
headers 设置请求头,类型为字典。
cookies 设置 Cookies,类型为字典或 RequestsCookieJar 对象。
files 用于上传文件,类型为字典,键为字段名,值为文件对象。
auth 用于 HTTP 基本认证,值为元组(用户名, 密码)​或自定义认证类。
timeout 设置超时时间(秒),支持元组(连接超时, 读取超时)​。
allow_redirects 是否允许重定向,默认为True​。
verify 是否验证 SSL 证书,默认为True​,可以传入证书路径。
stream 是否以流式获取响应内容,默认为False​。
proxies 设置代理服务器,类型为字典(如{'http': 'http://proxy.com:8080'}​)。

HTTP 状态码

状态码分类

分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

常见状态码

状态码 类别 描述
100 信息性 继续:服务器已收到请求,客户端应继续发送请求数据。
101 信息性 切换协议:服务器正在切换协议。
200 成功 OK:请求成功,服务器已处理并返回了请求数据。
201 成功 已创建:请求成功并导致新资源的创建。
202 成功 已接受:请求已接受,但尚未处理。
204 成功 无内容:服务器已成功处理请求,但没有返回任何内容。
301 重定向 永久重定向:请求的资源已永久移动到新位置。
302 重定向 临时重定向:请求的资源临时移动到新位置。
304 重定向 未修改:客户端的缓存文件仍然有效,无需重新下载。
400 客户端错误 错误的请求:请求无效,服务器无法理解。
401 客户端错误 未授权:请求需要身份验证。
403 客户端错误 禁止:服务器拒绝请求,客户端无权限访问资源。
404 客户端错误 未找到:请求的资源在服务器上不存在。
405 客户端错误 方法不允许:请求方法不被允许(如用 GET 请求 POST 资源)。
408 客户端错误 请求超时:客户端未能在规定时间内发送请求。
409 客户端错误 冲突:请求的操作与服务器上的现有资源发生冲突。
410 客户端错误 永久删除:请求的资源已被永久删除,且不可再访问。
413 客户端错误 请求实体过大:请求的数据大小超过了服务器的处理能力。
414 客户端错误 请求 URI 过长:请求的 URI 超过了服务器的处理限制。
415 客户端错误 不支持的媒体类型:请求的数据格式不被服务器支持。
429 客户端错误 请求过多:客户端发送的请求过于频繁,达到限制。
500 服务器错误 服务器内部错误:服务器遇到错误,无法完成请求。
501 服务器错误 未实现:服务器不支持请求的功能,无法完成请求。
502 服务器错误 错误网关:服务器作为网关或代理,收到无效响应。
503 服务器错误 服务不可用:服务器暂时无法处理请求,可能是因为超载或维护。
504 服务器错误 网关超时:作为网关或代理的服务器未及时从上游服务器接收到请求。
505 服务器错误 HTTP 版本不受支持:服务器不支持请求中所使用的 HTTP 版本。