RESTful Request:GET/PUT/DELETE/POST/HEAD/OPTIONS
2016-02-29 00:00
351 查看
RESTful Request:GET/PUT/DELETE/POST/HEAD/OPTIONS
作者: cshao 日期: 2013/02/27 发表评论 (0) 查看评论在RESTful的Web世界里,我们真正可以操作的Request类型其实很少,HTTP仅提供了寥寥无几的几种Request,其中绝大多数Web操作都是由以下四种Request来完成的:
HTTP GET: 获取资源
HTTP PUT/POST: 创建/添加资源
HTTP PUT: 修改资源
HTTP DELETE: 删除资源
本文将介绍上述四种Request类型的使用,同时也会简略介绍HEAD与OPTIONS请求。
参考书籍:《RESTful Web Services》, Chapter 4, “The Resource-Oriented Architecture”
补充:其中put和post最本质的区别为:put是幂等,即同一个url无论请求多少次,请求结果都是一致的。
restful设计规范参考请访问:http://developer.openstack.org/api-guide/quick-start/index.html
GET, PUT和DELETE
GET请求用于向Server端获取资源,而DELETE请求则用于删除Server端的某个资源。GET的Response一般包含资源的内容,而DELETE的Response可能包含一些状态信息(删除成功或者失败),也可能什么都不包含。比如:GET /web/blog/3 这个请求会获取第三篇blog的内容,而DELETE /web/blog/3 这个请求则会删除第三篇blog。
PUT请求用于在Server端创建新的资源 (create),或者对已有资源进行修改 (modify)。PUT请求中一般会包含该新资源的内容。
比如:PUT /web/blog 这个请求会在Server端创建一个新的资源,资源名称是blog;而PUT /web/blog/3 这个请求则会修改第三篇blog(用新的内容来覆盖旧的)。
POST
POST请求也可用于在Server端创建新资源,但是在RESTful的世界里,POST请求被定义为创建“从属资源”(拥有父资源的资源) (add)。这话比较拗口,看一下例子可能会清晰很多:在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这个父资源的资源)。
如何来判断某次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和OPTIONS
HEAD请求用于获取某个资源的元数据(metadata)–比如,该资源是否存在,该资源的内容长度是多少等等。OPTIONS请求用于获取某个资源所支持的Request类型,在OPTIONS请求的Response中会包含Allow头信息,比如:
Allow: GET HEAD
上述例子表示该资源只支持GET请求与HEAD请求。
值得注意的是,在OPTIONS请求中,不同的Request头信息会影响最终返回的Response结果。比如,在OPTIONS请求中加入正确的Authorization信息,得到的访问权限就可能更高。
相关文章推荐
- java.lang.Exception: Exception in sending Request :: null
- Android--Handler,Looper,MessageQueue的关系
- WebSphere Message Queue介绍
- 设置UIImage的渲染模式:UIImage.renderingMode
- 获取手机信息(UIDevice、NSBundle、NSLocale)
- 使用Arduino录制与播放遥控器的红外信号
- 笔记:SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <1MB model size
- UIView属性clipsTobounds的应用
- Jmeter性能测试,MySQL JDBC request
- UIGestureRecognizer
- EasyUI Combobox 级联查询
- npm package.js Guide
- UIControl 的基本使用方法和 Target-Action 机制
- microservice-demo maven build 时报错(A required class is missing: org/codehaus/plexus/util/Scanner)
- UITableview代理方法与Viewcontroller分离
- Dynamic web module 3.0 requires Java 1.6 or newer解决办法
- 4.5.3 Async耗时操作必须由子线程完成,更新UI需要由主线程完成
- UITableView介绍 之 基本用法
- UINavigationController相关
- POJ Ultra-QuickSort 逆序数 树状数组 归并排序