5. Web资源集合 (Collections of Web Resources)
5. Web资源集合 (Collections of Web Resources)
本节描述了一种Web资源类型——集合,并讨论了它与HTTP URL命名空间和HTTP方法的交互。集合资源的目的是在服务器的命名空间中对类似集合的对象(例如文件系统目录)进行建模。
所有符合DAV的资源必须支持本文指定的HTTP URL命名空间模型。
5.1 HTTP URL命名空间模型 (HTTP URL Namespace Model)
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)
集合资源与其他资源的不同之处在于它们也充当容器。某些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响应中仅公开每个映射一个一致选择的首选段。