9. 分布式创作的HTTP方法 (HTTP Methods for Distributed Authoring)
本章描述WebDAV定义的HTTP方法以及对现有HTTP方法的扩展。
WebDAV方法概述 (WebDAV Methods Overview)
| 方法 | 目的 | 目标 |
|---|---|---|
| PROPFIND | 检索资源属性 | 资源或集合 |
| PROPPATCH | 修改资源属性 | 资源 |
| MKCOL | 创建集合 | 未映射URL |
| COPY | 复制资源 | 源和目标 |
| MOVE | 移动/重命名资源 | 源和目标 |
| LOCK | 锁定资源 | 资源或集合 |
| UNLOCK | 解锁资源 | 锁定的资源 |
9.1 PROPFIND方法 (PROPFIND Method)
PROPFIND检索Request-URI标识的资源上定义的属性。
请求类型 (Request Types):
- propname: 检索所有属性名称
- allprop: 检索所有属性
- prop: 检索特定属性
- allprop + include: 检索所有属性加上其他属性
请求示例 (Example Request):
PROPFIND /file HTTP/1.1
Host: example.com
Depth: 0
Content-Type: application/xml
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:prop>
<D:displayname/>
<D:getcontentlength/>
<D:prop>
<D:propfind>
响应 (Response): 207 Multi-Status,包含属性值
Depth头 (Depth Header):
Depth: 0- 仅目标资源Depth: 1- 目标和直接成员Depth: infinity- 目标和所有后代
9.2 PROPPATCH方法 (PROPPATCH Method)
PROPPATCH修改资源上的属性。
操作 (Operations):
- set: 创建或更新属性
- remove: 删除属性
示例 (Example):
PROPPATCH /file HTTP/1.1
Host: example.com
<?xml version="1.0" encoding="utf-8" ?>
<D:propertyupdate xmlns:D="DAV:">
<D:set>
<D:prop><D:displayname>New Name<D:displayname><D:prop>
<D:set>
<D:remove>
<D:prop><D:author/><D:prop>
<D:remove>
<D:propertyupdate>
原子性 (Atomicity): 所有操作必须一起成功或失败。
9.3 MKCOL方法 (MKCOL Method)
MKCOL在Request-URI处创建新的集合资源。
示例 (Example):
MKCOL /new-collection/ HTTP/1.1
Host: example.com
要求 (Requirements):
- Request-URI必须是未映射的URL
- 父集合必须存在
- 请求主体应该为空(或可以包含内容类型信息)
状态码 (Status Codes):
- 201 Created - 集合成功创建
- 403 Forbidden - URL处已存在资源
- 409 Conflict - 父集合不存在
9.4 集合的GET、HEAD (GET, HEAD for Collections)
当应用于集合时,GET和HEAD可以返回:
- HTML目录列表
- 集合成员列表
- 空主体
行为是实现特定的。
9.5 集合的POST (POST for Collections)
集合的POST用于添加成员。服务器确定新成员URL。
9.6 DELETE方法 (DELETE Method)
DELETE删除Request-URI标识的资源。
对于集合 (For Collections):
- 递归删除集合和所有成员
- 如果省略Depth: infinity头,行为等同于Depth: infinity
部分失败 (Partial Failure): 如果任何成员的删除失败,整个操作失败(需要原子性)。
9.7 PUT方法 (PUT Method)
PUT创建或更新资源。
写锁交互 (Write Lock Interaction):
- 如果目标被锁定,客户端必须在
If头中提交适当的锁令牌 - 如果在未映射的URL上使用了LOCK,则创建锁空资源
9.8 COPY方法 (COPY Method)
COPY在目标位置创建源资源的副本。
头 (Headers):
- Destination: 目标URL(必需)
- Depth: 0或infinity(默认:infinity)
- Overwrite: T(true)或F(false)(默认:T)
示例 (Example):
COPY /source HTTP/1.1
Host: example.com
Destination: http://example.com/dest
Overwrite: F
Depth: infinity
行为 (Behavior):
- 复制资源内容和死属性
- 活属性根据其定义处理
- 集合复制是递归的(使用Depth: infinity)
- 不复制锁
状态码 (Status Codes):
- 201 Created - 目标已创建
- 204 No Content - 目标已覆盖
- 207 Multi-Status - 部分成功(某些成员失败)
- 412 Precondition Failed - Overwrite: F且目标存在
9.9 MOVE方法 (MOVE Method)
MOVE在逻辑上等同于COPY + DELETE。
示例 (Example):
MOVE /old-location HTTP/1.1
Host: example.com
Destination: http://example.com/new-location
Overwrite: T
行为 (Behavior):
- 将资源移动到目标
- 更新所有引用该资源的URL
- 保留属性
- 删除源上的锁
- 移动后目标不被锁定
原子性 (Atomicity): MOVE操作必须是原子的(不分为COPY + DELETE)。
9.10 LOCK方法 (LOCK Method)
LOCK获取资源上的锁。
锁类型 (Lock Types):
- 独占写锁 (Exclusive write lock): 只有一个主体可以持有
- 共享写锁 (Shared write lock): 多个主体可以持有
示例 (Example):
LOCK /resource HTTP/1.1
Host: example.com
Timeout: Second-3600
Depth: 0
<?xml version="1.0" encoding="utf-8" ?>
<D:lockinfo xmlns:D="DAV:">
<D:lockscope><D:exclusive/><D:lockscope>
<D:locktype><D:write/><D:locktype>
<D:owner>
<D:href>http://example.com/user<D:href>
<D:owner>
<D:lockinfo>
响应 (Response): 200 OK,包含lockdiscovery属性,其中包含锁令牌。
锁刷新 (Lock Refresh): 在If头中提交带有锁令牌的LOCK,无主体。
9.11 UNLOCK方法 (UNLOCK Method)
UNLOCK删除由锁令牌标识的锁。
示例 (Example):
UNLOCK /resource HTTP/1.1
Host: example.com
Lock-Token: <opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>
要求 (Requirements):
- Lock-Token头必须包含锁令牌
- 只有锁创建者或特权主体可以解锁
状态码 (Status Codes):
- 204 No Content - 锁成功删除
- 409 Conflict - 资源未被锁定
- 423 Locked - 资源被不同的令牌锁定
有关完整的方法规范、错误处理和详细示例,请参阅RFC 4918第9.1-9.11节。