Skip to main content

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

前置条件

创建集合必须满足:

  1. 目标URL必须未映射(不存在)
  2. 父集合必须存在
  3. 客户端必须有创建权限

状态码

  • 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)。