Skip to main content

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节。