5. Collections of Web Resources (Web 资源的集合)
5. Collections of Web Resources (Web 资源的集合)
本节提供了一种 Web 资源类型 (collection, 集合) 的描述, 并讨论了它与 HTTP URL 命名空间和 HTTP 方法的交互。集合资源的目的是在服务器的命名空间内对类似集合的对象 (例如, 文件系统目录) 进行建模。
所有符合 DAV 的资源必须支持此处指定的 HTTP URL 命名空间模型。
5.1 HTTP URL Namespace Model (HTTP URL 命名空间模型)
HTTP URL 命名空间是一个层次命名空间, 其中层次结构用 "/" 字符分隔。
如果 HTTP URL 命名空间满足以下条件, 则称其为一致的: 对于 HTTP 层次结构中的每个 URL, 都存在一个包含该 URL 作为内部成员 URL 的集合。所考虑的命名空间的根或顶级集合不受先前规则的约束。所考虑的命名空间的顶级集合不一定是由绝对路径 '/' 标识的集合 -- 它可能由一个或多个路径段标识 (例如, /servlets/webdav/...)
HTTP/1.1 和 WebDAV 都不要求整个 HTTP URL 命名空间是一致的 -- 符合 WebDAV 的资源可能没有父集合。但是, 某些 WebDAV 方法被禁止产生导致命名空间不一致的结果。
正如 [RFC2616] 和 [RFC3986] 中隐含的那样, 任何资源 (包括集合资源) 可以由多个 URI 标识。例如, 一个资源可以由多个 HTTP URL 标识。
5.2 Collection Resources (集合资源)
Collection resources (集合资源) 与其他资源的不同之处在于它们还充当容器。某些 HTTP 方法仅适用于集合, 但有些适用于集合定义的容器内的部分或全部资源。当方法的作用域不明确时, 客户端可以指定要应用的深度。深度可以是零级 (仅集合), 一级 (集合和直接包含的资源), 或无限级 (集合和所有递归包含的资源)。
集合的状态至少包括路径段和资源之间的一组映射, 以及集合本身的一组属性。在本文档中, 如果存在映射到 B 的路径段映射并且该映射包含在 A 中, 则称资源 B 包含在集合资源 A 中。集合必须为给定路径段最多包含一个映射, 即, 将同一路径段映射到多个资源是非法的。
在集合上定义的属性的行为与在非集合资源上的属性完全相同。集合可以具有额外的状态, 例如由 GET 返回的实体主体。
对于所有符合 WebDAV 的资源 A 和 B, 分别由 URL "U" 和 "V" 标识, 使得 "V" 等于 "U/SEGMENT", A 必须是包含从 "SEGMENT" 到 B 的映射的集合。因此, 如果具有 URL http://example.com/bar/blah 的资源 B 符合 WebDAV, 并且具有 URL http://example.com/bar/ 的资源 A 符合 WebDAV, 则资源 A 必须是集合, 并且必须恰好包含从 "blah" 到 B 的一个映射。
虽然通常映射由单个段和资源组成, 但一般来说, 映射由一组段和资源组成。这允许服务器将一组段视为等效的 (即, 要么所有段都映射到同一资源, 要么没有段映射到资源)。例如, 对段执行大小写折叠的服务器将把段 "ab", "Ab", "aB" 和 "AB" 视为等效的。然后客户端可以使用这些段中的任何一个来标识资源。请注意, PROPFIND 结果将选择这些等效段之一来标识映射, 因此每个映射将有一个 PROPFIND 响应元素, 而不是映射中的每个段一个。
集合资源可以具有到 HTTP URL 命名空间层次结构中非符合 WebDAV 的资源的映射, 但不是必需的。例如, 如果具有 URL http://example.com/bar/blah 的资源 X 不符合 WebDAV, 并且具有 URL http://example.com/bar/ 的资源 A 标识一个 WebDAV 集合, 则 A 可能有也可能没有从 "blah" 到 X 的映射。
如果符合 WebDAV 的资源在 HTTP URL 命名空间层次结构中没有符合 WebDAV 的内部成员, 则不要求该符合 WebDAV 的资源是集合。
有一个长期惯例, 即当通过没有尾部斜杠的名称引用集合时, 服务器可以处理请求, 就好像存在尾部斜杠一样。在这种情况下, 它应该在响应中返回 Content-Location 头, 指向以 "/" 结尾的 URL。例如, 如果客户端在 http://example.com/blah (没有尾部斜杠) 上调用方法, 服务器可能会响应, 就好像操作是在 http://example.com/blah/ (尾部斜杠) 上调用的, 并且应该返回值为 http://example.com/blah/ 的 Content-Location 头。无论服务器在哪里生成引用集合的 URL, 服务器都应该包含尾部斜杠。一般来说, 客户端应该使用集合名称的尾部斜杠形式。如果客户端不使用尾部斜杠形式, 则客户端需要准备好看到重定向响应。客户端会发现 DAV:resourcetype 属性比 URL 更可靠地确定资源是否是集合。
客户端必须能够支持 WebDAV 资源包含在非 WebDAV 资源内的情况。例如, 如果来自 http://example.com/servlet/dav/collection 的 OPTIONS 响应指示 WebDAV 支持, 则客户端不能假设 http://example.com/servlet/dav/ 或其父级必然是 WebDAV 集合。
映射的 URL 不作为其父集合的成员出现的典型场景是服务器允许链接或重定向到非 WebDAV 资源的情况。例如, "/col/link" 可能不作为 "/col/" 的成员出现, 尽管服务器会对 "/col/link" 的 GET 请求响应 302 状态; 因此, URL "/col/link" 确实会被映射。类似地, 动态生成的页面可能具有来自 "/col/index.html" 的 URL 映射, 因此此资源可能会对 GET 请求响应 200 OK, 但不作为 "/col/" 的成员出现。
甚至到符合 WebDAV 的资源的某些映射也可能不会出现在父集合中。此情况的一个示例是支持每个符合 WebDAV 的资源的多个别名 URL 的服务器。服务器可能实现不区分大小写的 URL, 因此 "/col/a" 和 "/col/A" 标识相同的资源, 但在列出 "/col" 的成员时仅报告 "a" 或 "A" 中的一个。在服务器将一组段视为等效的情况下, 服务器必须在 PROPFIND 响应中仅公开每个映射的一个首选段, 并且一致地选择。