5月阅读周·HTTP权威指南:发布系统之COPY与MOVE方法篇
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议)是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
发布系统
COPY与MOVE方法
和MKCOL一样,有若干种方法可以定义新的COPY和MOVE操作方法。其中一种方式规定COPY方法先对源进行GET请求,下载资源,然后用PUT请求上传回服务器。可以设想,MOVE方法也有类似的操作情况(有个额外的DELETE操作)。然而,这种处理过程无法很好地适应规模扩展——考虑一下在多级的集合上进行COPY或MOVE操作管理所涉及的问题吧。
COPY和MOVE方法都将请求URL作为源,HTTP的Destination首部的内容作为目标。MOVE方法在COPY方法之外还要做一些工作:它把源URL复制到目的地,检查新创建的URI的完整性,再把源删除。请求示例如下:
{COPY, MOVE} /publishing HTTP/1.1
Destination: http://minstar/pub-new
Depth: infinity
Overwrite: T
Host: minstar
其响应示例如下:
HTTP/1.1201 Created
Server: Microsoft-IIS/5.0
Date: Wed, 15 May 2002 18:29:53 GMT
Location: http://minstar.inktomi.com/pub-new/
Content-Type: text/xml
Content-Length: 0
在对集合操作时,COPY或MOVE的行为受到Depth首部的影响。如果没有Depth首部,就默认其值是无穷大(就是说,默认会把源目录的整个结构进行复制或移动)。如果Depth设置为0,方法就只作用于资源本身。如果我们是对集合进行复制或移动的话,在目的地就只创建和源具有相同属性的集合——集合内部的成员就不再复制或移动了。对于MOVE方法,Depth首部的值只允许为无穷大,原因显而易见。
1.Overwrite首部的效果
COPY和MOVE方法也可能使用Overwrite首部。Overwrite首部的值可以是T或F。如果设置为T而且目标已存在,就在COPY或MOVE之前,对目标资源执行Depth值为无穷大的DELETE操作。如果Overwrite标志设置为F而目标资源存在,则操作会失败。
2.对属性的COPY/MOVE
当复制集合或元素时,默认会复制其所有属性。不过,请求可以带有可选的XML主体来提供额外的操作信息。可以指定要使操作成功,必须成功复制所有属性;或者定义要使操作成功,必须复制哪些属性。下面有两个特殊状况下的例子。
· 假设把COPY或MOVE作用到CGI程序或者其他产生内容的脚本程序的输出上。为了保持语义,如果由CGI脚本产生的文件被复制或移动了,WebDAV要提供src和link这两个XML元素,指向产生此页面的程序的位置。
· COPY和MOVE方法不一定能够复制所有的活属性。例如,我们来看一个CGI程序。如果从cgi-bin目录中把它拷贝走,可能就不会再去执行它了。
WebDAV的现有规范让COPY和MOVE实现的是“尽力而为”解决方案,复制所有的静态属性和合适的活属性。
3.被锁定的资源与COPY/MOVE
如果资源目前正被锁定,COPY和MOVE都禁止把锁移动或复制到目标上。在这两种情况下,如果要在一个自己有锁的现存集合中创建目标,所复制或移动的资源就会被加到那个锁中。请看下面的例子:
COPY /publishing HTTP/1.1
Destination: http://minstar/archived/publishing-old
假设/publishing和/archived分别处于两个不同的锁之下:lock1和lock2。当COPY操作结束时,/publishing仍旧处于lock1的范围内,而由于移动到了已被lock2锁定的集合中,publishing-old被加入到了lock2中。如果是MOVE操作,就只有publishing-old被加入lock2。
总结
怎样创建Web页面并放到Web服务器上去呢?在Web发展的“蛮荒”时代(比如1995年),可能要在文本编辑器中手工拼凑HTML,用FTP手动把内容上传到Web服务器。这个过程很痛苦,很难与同事配合,也不是特别安全。如今的发布工具使得创建、发布以及管理Web内容方便了许多。今天,用户可以交互式地编辑Web内容,在屏幕上看到它实际呈现的样子,轻轻点击一下就可以把内容发布到服务器,还能得到所有文件变化的通知。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)