5月阅读周·HTTP权威指南:发布系统之属性和元数据篇
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议)是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
发布系统
属性和元数据
属性描述了资源的信息,包括作者的名字、修改日期、内容分级,等等。HTML中的元标记的确提供了把这种信息嵌入在内容之中的机制,但很多种资源(比如所有二进制数据)都无法嵌入元数据。
像WebDAV这样的分布式协作系统对属性的需求就更复杂了。例如,考虑作者属性:当文档被编辑之后,应当更新这个属性以反映新的作者。WebDAV专门把这种可动态修改的属性称为“活”属性。与之相对的是更长久的静态属性,比如Content-Type,称为“死”属性。为了支持查找和修改属性,WebDAV扩展了HTTP以包括两个新方法:PROPFIND和PROPPATCH。
PROPFIND方法
PROPFIND方法用于获取一个给定文件或一组文件(也称为“集合”)的属性。PROPFIND支持3种类型的操作:
- 请求所有的属性及其值;
- 请求一组属性及其值;
- 请求所有属性的名称。
下面这个例子中,请求的是所有属性及其值:
PROPFIND /ch-publish.fm HTTP/1.1
Host: minstar.inktomi.com
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
Depth: 0
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 0
<propfind>请求元素指定了从PROPFIND方法返回的属性。下面的列表总结了用于PROPFIND请求的一些XML元素:
- <allprop>要求返回所有属性的名字和值。为了请求所有的属性及其值,WebDAV客户端可以将XML子元素<allprop>作为<propfind> 元素的一部分发送,或提交一个没有主体的请求。
- <propname>指定要返回属性名字的集合。
- <prop><propfind>元素的子元素。指定需要返回值的属性。例如:<a:prop><a:owner/>...... </a:prop>。
下面是对一个PROPFIND请求示例的响应:
HTTP/1.1207 Multi-Status
Server: Microsoft-IIS/5.0
...........
<? xml version="1.0"? >
<a:multistatusxmlns:b="urn:uuid:********/" xmlns:c="xml:"
xmlns:a="DAV:">
<a:response>
<a:href>http://minstar/ch-publish.fm </a:href>
<a:propstat>
<a:status>HTTP/1.1200OK</a:status>
<a:prop>
<a:getcontentlength b:dt="int">1155</a:getcontentlength>
......................
......................
<a:ishidden b:dt="boolean">0</a:ishidden>
<a:iscollection b:dt="boolean">0</a:iscollection>
</a:prop>
</a:propstat>
</a:response></a:multistatus>
在这个例子中,服务器以207 Multi-Status状态码进行响应。WebDAV将207用在PROPFIND和其他几个WebDAV方法上,它们同时作用在多个资源上并且每个资源可能有不同的响应。响应中的几个XML元素的定义如下所示。
- <multistatus>多重响应的容器。
- <href>标识资源的URI。
- <status>包含特定请求的HTTP状态码。
- <propstat>将一个<status>元素和一个<prop>元素组织在一起。<prop>元素可以包含给定资源的一个或多个属性名/值对。
在上面列出的示例响应中,响应是针对URI:http://xxx.fm的。<propstat>元素内嵌了一个<status>元素和一个<prop>元素。服务器为这个URI回复了一个200 OK响应,它定义在<status>元素中。<prop>元素中有若干子元素,例子中只列出了一部分。PROPFIND的实例应用是对目录列表的支持。考虑到PROPFIND请求的表达能力,单次调用就能获取集合的整个层次结构和其中各个独立实体的所有属性。
PROPPATCH方法
PROPPATCH方法为对指定资源设置或删除多个属性提供了原子化机制。原子化可以保证要么所有请求都成功,要么跟所有请求都没发出一样。PROPPATCH方法的XML基元素是<propertyupdate>。它作为一个容器使用,容纳了需要修改的属性。XML的<set>和<remove>元素用于描述操作。
- <set>指定要设置的属性值。<set>含有一个或多个<prop>子元素,它们依次包含了该资源上要设置的属性的名/值对。如果属性已存在,其值就被覆盖。
- <remove>指定要删除的属性。与<set>不同的是,在<prop>容器中只列出了属性的名称。
下面这个小例子设置并删除了owner属性:
<d:propertyupdate xmlns:d="DAV:" xmlns:o="http://name-space/scheme/">
<d:set>
<d:prop>
<o:owner>Author A</o:owner>
</d:prop>
</d:set>
<d:remove>
<d:prop>
<o:owner/>
</d:prop>
</d:remove>
</d:propertyupdate>
对PROPPATCH请求的响应和对PROPFIND请求的响应非常像。
总结
怎样创建Web页面并放到Web服务器上去呢?在Web发展的“蛮荒”时代(比如1995年),可能要在文本编辑器中手工拼凑HTML,用FTP手动把内容上传到Web服务器。这个过程很痛苦,很难与同事配合,也不是特别安全。如今的发布工具使得创建、发布以及管理Web内容方便了许多。今天,用户可以交互式地编辑Web内容,在屏幕上看到它实际呈现的样子,轻轻点击一下就可以把内容发布到服务器,还能得到所有文件变化的通知。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)