requests 怎么发送 MKCOL 等自定义 HTTP 动词?使用 request() 方法对接 WebDAV 服务
对接 WebDAV 类服务时,经常会用到 MKCOL(在文档中作为部分 WebDAV 服务器使用的动词示例)、PROPFIND 这类不在 get、post、put 等快捷方法覆盖范围内的 HTTP 动词。requests 的顶层 API 只封装了常见的少数几种请求方式,但底层的 :func:request <requests.api.request> 方法接受任意动词字符串作为第一个参数,因此任何服务器允许的方法动词都能通过它发出。本文以发送 MKCOL 为例,给出从安装、发请求到验证响应、处理认证和异常的完整操作路径。
准备环境
在任意终端中用 pip 安装 requests(来自安装文档):
$ python -m pip install requests
安装完成后即可 import requests。
用 request() 发送 MKCOL 请求
requests 顶层的 request() 签名是 request(method, url, **kwargs),其中 method 是一个字符串,文档在自定义动词一节中给出的 WebDAV 示例如下:
import requests
# url 和 data 替换为你自己的 WebDAV 服务器地址和请求体
url = "https://your-webdav-server.example.com/path/to/collection"
data = b"some data"
r = requests.request('MKCOL', url, data=data)
文档对该示例的说明是:服务器响应示例为 r.status_code 返回 200(文档原话是 "Assuming your call was correct",即假定你的调用是正确的,这只是文档示例输出,不是固定预期)。同一写法适用于服务器允许的任何其他动词,只需替换第一个参数,例如 requests.request('PROPFIND', url)。
与 get、post 等快捷方法相比,request() 还多接收一个 method 参数,但其余行为一致:它内部创建一个临时 Session,把 method、url 和 **kwargs 交给 session.request() 处理并返回 Response 对象,见 src/requests/api.py。
验证响应
发完请求后,用返回的 Response 对象判断结果(来自快速上手文档):
# 状态码
print(r.status_code)
# 与常用状态常量比较
print(r.status_code == requests.codes.ok)
# 读取响应体(文本或字节)
print(r.text)
print(r.content)
# 读取响应头,字典键大小写不敏感
print(r.headers['Content-Type'])
如果收到 4XX/5XX 响应,可以主动抛出异常来中断流程:
r.raise_for_status() # 非 2XX/3XX 时抛出 requests.exceptions.HTTPError
文档特别指出:r.json() 调用成功并不代表请求成功(服务器可能在 500 响应里返回 JSON 错误详情),判断请求是否成功应使用 r.raise_for_status() 或检查 r.status_code 是否符合预期。
为 WebDAV 请求添加认证
文档中没有 WebDAV 专属的认证封装,但 request() 接受与其他请求方法相同的 auth、headers、data 等参数(见 src/requests/api.py 中的参数说明)。需要 Basic Auth 时,可以直接复用文档中给出的方式(认证文档、advanced.rst 的示例):
from requests.auth import HTTPBasicAuth
auth = HTTPBasicAuth('user', 'password') # 替换为实际账号密码
r = requests.request('MKCOL', url, data=data, auth=auth)
其他常用参数(均见 request() 的文档字符串):
params:以字典形式附加查询字符串;data:请求体,字典会自动做 form 编码,字符串/字节则原样发送;headers:附加自定义 HTTP 头,如requests.request('MKCOL', url, headers={'User-Agent': 'my-app/0.0.1'})。注意 Authorization 头在遇到跨主机重定向时会被移除;timeout:秒数,超时抛出requests.exceptions.Timeout。文档建议几乎所有生产代码都应设置该参数,否则程序可能无限挂起。
需要多次调用同一服务器时使用 Session
顶层 requests.request() 每次调用都会新建并关闭一个 Session(源码中用 with sessions.Session() as session 包裹)。如果脚本要对同一 WebDAV 服务器连续执行 MKCOL、PROPFIND 等多个操作,可以直接维护一个 Session 并调用它的 request() 方法:
s = requests.Session()
r = s.request('MKCOL', url, data=data, auth=auth, timeout=5)
# 后续请求继续复用 s.request(...)
s.close()
常见异常对照
来自快速上手文档的 Errors and Exceptions 一节:
| 现象 | 异常 |
|---|---|
| 网络问题(DNS 失败、连接被拒绝等) | requests.exceptions.ConnectionError |
HTTP 请求返回不成功状态码且调用了 raise_for_status() |
requests.exceptions.HTTPError |
| 等待响应超时 | requests.exceptions.Timeout |
| 超过最大重定向次数 | requests.exceptions.TooManyRedirects |
以上异常都继承自 requests.exceptions.RequestException,捕获这一基类即可统一处理。另外,allow_redirects 参数可以开启或关闭 GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD 的重定向跟随,对自定义动词的默认行为文档未单独说明,遇到返回 301/302 时可显式设置该参数观察行为。
限制说明
- 文档只给出
requests.request('MKCOL', url, data=data)这一层支持:动词本身由服务器端实现,requests 只负责把方法名原样放入请求行,不会替你实现 WebDAV 协议逻辑(如 PROPFIND 的响应体解析)。 - 成功状态码取决于服务器实现,文档中的
200仅是示例输出,不能作为固定断言。 request()的参数文档中method示例列举的是 GET/OPTIONS/HEAD/POST/PUT/PATCH/DELETE,但参数类型为字符串,advanced.rst 明确说明"you can make use of any method verb that your server allows"。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python08
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00