WebDAV (Web Distributed Authoring and Versioning,分布式写作与版本管理)为 Web 发布增添了新的内容——协作。
WebDAV (作为 RFC 2518 发表)专注于对 HTTP 进行扩展,以提供协作写作的适宜平台。
1. WebDAV 的方法
WebDAV 定义了一些新的 HTTP 方法并修改了其他一些 HTTP 方法的操作范围。WebDAV 新增的方法如下所述:
PROPFIND:获取资源的属性。
PROPPATCH:在一个或多个资源上设定一个或多个属性。
MKCOL:创建集合。
COPY:从指定的源端把资源或者资源集合复制到指定的目的地。目的地可以在另一台机器上。
MOVE:从指定的源端把资源或者资源集合移动到指定的目的地。目的地可以在另一台机器上。
LOCK:锁定一个或多个资源。
UNLOCK:把先前锁定的资源解锁。
WebDAV 修改的 HTTP 方法有 DELETE、PUT 以及 OPTIONS,稍后详细讨论。
2. WebDAV 与 XML
WebDAV 的方法通常都需要在请求和响应中关联大量的信息。HTTP 通常用报文首部来交换这类信息。然而,只在首部传输必要的信息已经暴露了一些局限性,包括难以有选择地对请求中的多个资源应用首部信息、不利于表示层次结构等。
WebDAV 借助了 XML 解决这个问题,它是一种元标记语言,提供了描述结构化数据的格式。XML 为 WebDAV 提供了以下解决方案:
对那些描述数据处理方式的指令进行格式化的方法。
在服务器上对复杂的响应进行格式化的方法。
交换与所处理的集合和资源有关的定制信息的方法。
承载数据自身的灵活工具。
对大多数国际化问题的健壮解决方案。
习惯上会把 XML 文档里引用的方案定义保存在一个 DTD(Document Type Definition,文档类型定义)文件中。因此,试图解释 XML 文档时,可以根据其中的 DOCTYPE 定义项得到和这份 XML 文档相关的 DTD 文件名。
WebDAV 定义了一个显式的 XML 名字空间——“DAV:”。简单地说,XML 的名字空间就是元素或属性的名字的集合。名字空间限定了嵌入的名字在域内必须是唯一的,这样就可以避免名字冲突。
WebDAV 规范(也就是 RFC 2518),定义了完整的 XML 方案。预定义的方案允许解析软件不必读取 DTD 文件,而是根据预定义的 XML 方案来解释。
3. WebDAV 首部集
WebDAV 的确引入了一些 HTTP 首部来增强新方法的功能。简要介绍如下:
DAV 用于了解服务器的 WebDAV 能力。WebDAV 支持的所有资源在响应 OPTIONS 请求时都要含有此首部。 DAV = "DAV" ":" "1" ["," "2"] ["," 1#extend]
Depth 这是一个关键元素,用于把 WebDAV 扩展到支持含有多级层次关系的资源组。 Depth = "Depth" ":" ("0" | "1" | "infinity")
我们来看一个简单的例子。假设有个目录 DIR_A,其中有文件 file_1.html 和 file_2.html。如果某方法设置了 Depth:0,此方法就只作用到目录 DIR_A 自身;如果设置了 Depth:1,就作用到目录 DIR_A 及其包含的文件 file_1.html 和 file_2.html。 Depth 首部对 WebDAV 定义的许多方法进行了修饰。用到 Depth 首部的方法有:LOCK、COPY 以及 MOVE。
Destination 定义这个首部是用来辅助 COPY 或 MOVE 方法标识目标 URI 的。 Destination = "Destination" ":" absoluteURI
If 定义的唯一一个状态令牌是锁定令牌。If 首部定义了一组条件,如果这些条件都取值为非,请求就失败。类似 COPY 和 PUT 等方法可以在 If 首部中指定前置条件,使其有条件地适用。在实践中,最常见的需要满足的前置条件是先获得锁。 If ="If"":" (1*No-tag-list | 1*Tagged-list)
No-tag-list = List
Tagged-list = Resource 1*List
Resource = Coded-URL
List = "(" 1*(["Not"](State-token | "[" entity-tag "]")) ")"
State-token = Coded-URL
Coded-URL = "<" absoluteURI ">"
Lock-Token UNLOCK 方法需要用这个首部指定要删除的锁。LOCK 方法的响应中也有 Lock-Token 首部,载有关于锁定令牌的必须信息。 Lock-Token ="Lock-Token"":"Coded-URL
Overwrite 用于 COPY 和 MOVE 方法,指定是否要覆盖目标。 Overwrite ="Overwrite"":" ("T" |"F")·
Timeout 客户端用这个请求首部指定要求锁定的超时值。 TimeOut = "Timeout" ":" 1#TimeType
TimeType = ("Second-" DAVTimeOutVal | "Infinite" | Other)
DAVTimeOutVal = 1*digit
Other = "Extend" field-value
4. WebDAV 的锁定与防止覆写
根据定义,协作要有不止一个人在给定的文档上工作。下图中,作者 A 和 B 联合编写一份规范。A 和 B 各自独立地对文档做了一些修改。A 把更新的文档上传到仓库。之后,B 也把自己的版本提交到仓库。不幸的是,由于 B 压根不知道 A 的修改,他没有把自己的版本与 A 的版本进行合并,从而导致 A 的修改丢失。
为了改善这种问题,WebDAV 支持锁定的概念。但单靠锁定不能完全解决这个问题,还需要版本管理和消息传送才能提供完整的解决方案。WebDAV 支持两种类型的锁:
对资源或集合的独占写锁;保证只有锁的拥有者有写权限,这种锁完全消除了潜在的冲突。
对资源或集合的共享写锁;允许多个人在某个给定的文件上工作,这种锁定机制在多名作者对各自的活动都知晓的环境下可以很好地工作。
WebDAV 通过 PROPFIND 方法提供了属性发现机制,可以判断对锁定的支持和所支持的锁定类型。
WebDAV 中有两个新方法支持锁定机制:LOCK 和 UNLOCK。
为了实现锁定,还需要有一种识别作者的机制。WebDAV 采用的是摘要认证。
批准锁定时,服务器将域内唯一的令牌返回给客户端。与此相关的规范是 opaquelocktoken 锁定令牌 URI 方案。当客户端随后要执行写操作时,它连接到服务器并完成摘要认证步骤。一旦认证完成,WebDAV 客户端就发出带有锁定令牌的 PUT 请求。这样,只有正确的用户加上锁定令牌才可以完成写操作。
5. LOCK 方法
WebDAV 中的一个强大特性是它能够允许单个 LOCK 请求锁定多个资源。WebDAV 的锁定不需要客户端保持与服务器的连接。下面是一个简单的 LOCK 请求示例:
LOCK /ch-publish.fm HTTP/1.1
Host: minstar
Content-Type: text/xml
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
Content-Length: 201
<?xml version="1.0"?>
<a:lockinfo xmlns:a ="DAV:" >
<a:lockscope > <a:exclusive /> </a:lockscope >