做者: cshao 日期: 2013/02/27 发表评论 (0) 查看评论html
在RESTful的Web世界里,咱们真正能够操做的Request类型其实不多,HTTP仅提供了寥寥无几的几种Request,其中绝大多数Web操做都是由如下四种Request来完成的:web
本文将介绍上述四种Request类型的使用,同时也会简略介绍HEAD与OPTIONS请求。api
参考书籍:《RESTful Web Services》, Chapter 4, “The Resource-Oriented Architecture”restful
补充:其中put和post最本质的区别为:put是幂等,即同一个url不管请求多少次,请求结果都是一致的。app
restful设计规范参考请访问:http://developer.openstack.org/api-guide/quick-start/index.htmlide
GET请求用于向Server端获取资源,而DELETE请求则用于删除Server端的某个资源。GET的Response通常包含资源的内容,而DELETE的Response可能包含一些状态信息(删除成功或者失败),也可能什么都不包含。
好比:GET /web/blog/3 这个请求会获取第三篇blog的内容,而DELETE /web/blog/3 这个请求则会删除第三篇blog。post
PUT请求用于在Server端建立新的资源 (create),或者对已有资源进行修改 (modify)。PUT请求中通常会包含该新资源的内容。
好比:PUT /web/blog 这个请求会在Server端建立一个新的资源,资源名称是blog;而PUT /web/blog/3 这个请求则会修改第三篇blog(用新的内容来覆盖旧的)。ui
POST请求也可用于在Server端建立新资源,可是在RESTful的世界里,POST请求被定义为建立“从属资源”(拥有父资源的资源) (add)。这话比较拗口,看一下例子可能会清晰不少:url
在Server端没有/web/blog的状况下,使用PUT /web/blog请求能够在Server端建立blog资源。blog资源建立好以后,可使用POST /web/blog来添加一篇新的blog文章,POST请求成功后,咱们就拥有了/web/blog/1这个资源。假如当前已经有了三篇blog (/web/blog/1, /web/blog/2和/web/blog/3),那么POST /web/blog将在Server端添加第四篇blog文章(/web/blog/4) — 在这个场景中,/web/blog/1, /web/blog/2, /web/blog/3和/web/blog/4都是“从属资源”(拥有/web/blog这个父资源的资源)。spa
如何来判断某次Request涉及的资源是从属资源呢?除了从概念逻辑上判断外,还有一个简便的方法来断定:对于POST请求来讲,将要被添加的“从属资源”是URI未知的 — 在POST /web/blog请求添加新的一篇blog文章的时候,client并不知道这会是第几篇blog,也不知道该blog建立后的URI是什么(/web/blog/35? 仍是/web/blog/42?)。与此相反,PUT请求建立、修改资源的时候,client端清楚的知道对应的URI (PUT /web/blog能够建立blog资源;在/web/blog已经存在的状况下,PUT /web/blog能够修改blog资源的设置;而PUT /web/blog/3则能够对某一篇特定的blog文章进行修改)。
除了添加新的“从属资源”,POST请求还有一种应用场景:对某个特定资源增补内容(append)。好比,对于第三篇blog,在blog的最后,添加一段内容 (POST /web/blog/3)。
对于PUT和POST的区别,咱们总结为:
PUT用于建立(Create)或修改(Modify),而POST用于添加(Add)或增补(Append)
根据上述总结可推论,在PUT和POST的属性之间,还有一个重要的区别:PUT是幂等的(Idempotent),而POST不是 — 同一个操做连续进行屡次,对于PUT而言其效果与只进行一次相同,但对于POST而言,每一次操做都会对Server端产生影响。
HEAD请求用于获取某个资源的元数据(metadata)–好比,该资源是否存在,该资源的内容长度是多少等等。
OPTIONS请求用于获取某个资源所支持的Request类型,在OPTIONS请求的Response中会包含Allow头信息,好比:
Allow: GET HEAD
上述例子表示该资源只支持GET请求与HEAD请求。
值得注意的是,在OPTIONS请求中,不一样的Request头信息会影响最终返回的Response结果。好比,在OPTIONS请求中加入正确的Authorization信息,获得的访问权限就可能更高。