9. HTTP Methods for Distributed Authoring (用于分布式创作的HTTP方法)
本章详细描述WebDAV定义的HTTP方法以及对现有HTTP方法的扩展。
WebDAV新增方法概览
WebDAV在HTTP/1.1的基础上新增了以下方法:
| 方法 | 用途 | 目标资源 |
|---|---|---|
| PROPFIND | 检索资源属性 | 单个资源或集合 |
| PROPPATCH | 修改资源属性 | 单个资源 |
| MKCOL | 创建集合 | 未映射的URL |
| COPY | 复制资源 | 源和目标资源 |
| MOVE | 移动/重命名资源 | 源和目标资源 |
| LOCK | 锁定资源 | 单个资源或集合 |
| UNLOCK | 解锁资源 | 锁定的资源 |
9.1 PROPFIND Method (PROPFIND方法)
PROPFIND方法用于检索由请求URL标识的资源的属性。
语法
PROPFIND /resource HTTP/1.1
Host: example.com
Depth: 0
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:prop>
<D:displayname/>
<D:getcontentlength/>
</D:prop>
</D:propfind>
PROPFIND请求主体类型
1. propname - 请求所有属性名称:
<D:propfind xmlns:D="DAV:">
<D:propname/>
</D:propfind>
2. allprop - 请求所有死属性和活属性:
<D:propfind xmlns:D="DAV:">
<D:allprop/>
</D:propfind>
3. prop - 请求指定属性:
<D:propfind xmlns:D="DAV:">
<D:prop>
<D:displayname/>
<D:getcontenttype/>
</D:prop>
</D:propfind>
4. allprop with include - 请求所有属性加上额外属性:
<D:propfind xmlns:D="DAV:">
<D:allprop/>
<D:include>
<D:supported-live-property-set/>
</D:include>
</D:propfind>
PROPFIND响应
响应使用207 Multi-Status状态码,包含每个属性的状态:
HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:">
<D:response>
<D:href>/resource</D:href>
<D:propstat>
<D:prop>
<D:displayname>Example Resource</D:displayname>
<D:getcontentlength>4525</D:getcontentlength>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>
Depth头行为
- Depth: 0 - 仅目标资源
- Depth: 1 - 目标资源及其直接成员
- Depth: infinity - 目标资源及所有成员(递归)
9.2 PROPPATCH Method (PROPPATCH方法)
PROPPATCH方法用于修改资源的属性。
语法
PROPPATCH /resource HTTP/1.1
Host: example.com
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:propertyupdate xmlns:D="DAV:">
<D:set>
<D:prop>
<D:displayname>New Display Name</D:displayname>
</D:prop>
</D:set>
<D:remove>
<D:prop>
<D:author/>
</D:prop>
</D:remove>
</D:propertyupdate>
操作类型
set - 设置属性值:
- 如果属性不存在,则创建
- 如果属性存在,则更新值
remove - 删除属性:
- 删除指定的属性
- 如果属性不存在,操作成功(幂等性)
原子性
PROPPATCH操作必须是原子的:
- 所有操作都成功,或者都失败
- 不允许部分成功
响应示例
HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:">
<D:response>
<D:href>/resource</D:href>
<D:propstat>
<D:prop><D:displayname/></D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
<D:propstat>
<D:prop><D:author/></D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>
9.3 MKCOL Method (MKCOL方法)
MKCOL方法用于创建新的集合资源。
语法
MKCOL /new-collection/ HTTP/1.1
Host: example.com
前置条件
创建集合必须满足:
- 目标URL必须未映射(不存在)
- 父集合必须存在
- 客户端必须有创建权限
状态码
- 201 Created - 集合创建成功
- 403 Forbidden - 权限不足或请求被拒绝
- 405 Method Not Allowed - 目标URL已存在
- 409 Conflict - 父集合不存在
- 415 Unsupported Media Type - 包含不支持的请求主体
- 507 Insufficient Storage - 存储空间不足
示例
<!-- 请求 -->
MKCOL /webdav/docs/ HTTP/1.1
Host: example.com
<!-- 响应 -->
HTTP/1.1 201 Created
9.4 GET, HEAD for Collections (集合的GET和HEAD)
GET和HEAD方法可应用于集合资源:
- 服务器可以返回集合的HTML表示
- 或返回集合成员的列表
- 具体行为由服务器实现决定
9.5 POST for Collections (集合的POST)
POST方法在WebDAV中的行为由服务器定义:
- 可用于向集合添加成员
- 可用于处理表单提交
- 具体语义由服务器实现
9.6 DELETE Requirements (DELETE要求)
DELETE方法删除由请求URL标识的资源。
集合的DELETE
删除集合时:
- Depth头被忽略 - DELETE总是删除整个集合树
- 递归删除 - 所有成员资源都会被删除
- 原子性 - 不保证原子性,可能部分成功
锁定和DELETE
- 删除锁定资源需要提交锁令牌
- 删除集合成员需要提交集合的锁令牌(如果集合被锁定)
示例
<!-- 删除单个资源 -->
DELETE /resource.txt HTTP/1.1
Host: example.com
<!-- 删除集合 -->
DELETE /collection/ HTTP/1.1
Host: example.com
9.7 PUT Requirements (PUT要求)
PUT方法存储由请求URL标识的实体主体。
WebDAV扩展
- 创建资源 - 如果URL未映射,创建新资源
- 更新资源 - 如果URL已映射,更新现有资源
- 锁定要求 - 如果资源被锁定,必须提交锁令牌
集合的PUT
服务器可以 (MAY) 拒绝对集合的PUT请求,返回405 Method Not Allowed。
9.8 COPY Method (COPY方法)
COPY方法创建源资源的副本到目标URL。
语法
COPY /source HTTP/1.1
Host: example.com
Destination: http://example.com/destination
Overwrite: T
Depth: infinity
头部
- Destination (必需): 目标URL
- Overwrite: T (覆盖) 或 F (不覆盖),默认T
- Depth: 0或infinity(仅对集合有效)
行为
非集合资源:
- 复制资源内容
- 复制死属性
- 活属性根据定义决定是否复制
集合资源:
- Depth: 0 - 仅复制集合本身
- Depth: infinity - 递归复制所有成员
锁和COPY
- 源资源的锁不会复制
- 如果目标被锁定且Overwrite:T,需要提交目标的锁令牌
示例
COPY /reports/report1.doc HTTP/1.1
Host: example.com
Destination: /backup/report1.doc
Overwrite: F
HTTP/1.1 201 Created
9.9 MOVE Method (MOVE方法)
MOVE方法将资源从一个URL移动到另一个URL,相当于COPY + DELETE的原子操作。
语法
MOVE /old-location HTTP/1.1
Host: example.com
Destination: /new-location
Overwrite: T
与COPY的区别
- MOVE是原子操作
- MOVE后源资源被删除
- 源资源的锁会移动到目标位置
集合的MOVE
- Depth头必须是infinity或省略
- 递归移动所有成员
- 保持集合结构
示例
<!-- 重命名文件 -->
MOVE /docs/old-name.txt HTTP/1.1
Host: example.com
Destination: /docs/new-name.txt
<!-- 移动到不同目录 -->
MOVE /temp/file.txt HTTP/1.1
Host: example.com
Destination: /archive/file.txt
9.10 LOCK Method (LOCK方法)
LOCK方法用于创建新锁或刷新现有锁。
创建新锁
LOCK /resource HTTP/1.1
Host: example.com
Timeout: Second-3600
Depth: 0
Content-Type: application/xml; charset="utf-8"
<?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>mailto:[email protected]</D:href>
</D:owner>
</D:lockinfo>
响应
HTTP/1.1 200 OK
Lock-Token: <urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>
Content-Type: application/xml; charset="utf-8"
<?xml version="1.0" encoding="utf-8" ?>
<D:prop xmlns:D="DAV:">
<D:lockdiscovery>
<D:activelock>
<D:locktype><D:write/></D:locktype>
<D:lockscope><D:exclusive/></D:lockscope>
<D:depth>0</D:depth>
<D:owner>
<D:href>mailto:[email protected]</D:href>
</D:owner>
<D:timeout>Second-3600</D:timeout>
<D:locktoken>
<D:href>urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4</D:href>
</D:locktoken>
<D:lockroot>
<D:href>/resource</D:href>
</D:lockroot>
</D:activelock>
</D:lockdiscovery>
</D:prop>
刷新锁
LOCK /resource HTTP/1.1
Host: example.com
Timeout: Second-3600
If: (<urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>)
9.11 UNLOCK Method (UNLOCK方法)
UNLOCK方法删除由Lock-Token头标识的锁。
语法
UNLOCK /resource HTTP/1.1
Host: example.com
Lock-Token: <urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>
HTTP/1.1 204 No Content
要求
- 必须提供Lock-Token头
- 请求主体必须为空
- 只有锁的创建者或授权用户可以解锁
本章总结:第9章详细定义了WebDAV的7个新HTTP方法以及对现有HTTP方法的扩展,这些方法提供了远程Web创作的核心功能,包括属性管理(PROPFIND/PROPPATCH)、集合管理(MKCOL)、资源操作(COPY/MOVE/DELETE)和并发控制(LOCK/UNLOCK)。