Requests
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 请求,查看响应,进行断言,学习如何设置请求头、请求体等,国内平替如 Apipost 、Apifox,推荐 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 编写自动化测试脚本,如使用 Requests 或 http.client 发送 HTTP 请求并验证响应。
- Java:使用 RestAssured 或 JUnit 等库来进行 API 自动化测试。
- JavaScript:如果你熟悉 JavaScript,可以使用 Mocha、Chai 和 Supertest 等框架进行 API 测试。
- Ruby:使用 RSpec 和 HTTParty 进行 API 测试。
安装¶
pip install requests |
使用¶
基本使用流程:
import requests |
速查表¶
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 版本。 |