2019独角兽企业重金招聘Python工程师标准>>>

RESTful Request:GET/PUT/DELETE/POST/HEAD/OPTIONS

作者: cshao 日期: 2013/02/27 发表评论 (0) 查看评论

在RESTful的Web世界里,我们真正可以操作的Request类型其实很少,HTTP仅提供了寥寥无几的几种Request,其中绝大多数Web操作都是由以下四种Request来完成的:

  1. HTTP GET: 获取资源
  2. HTTP PUT/POST: 创建/添加资源
  3. HTTP PUT: 修改资源
  4. 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信息,得到的访问权限就可能更高。

转载于:https://my.oschina.net/tantexian/blog/625825

RESTful Request:GET/PUT/DELETE/POST/HEAD/OPTIONS相关推荐

  1. restful,RESTful API 设计,GET/PUT/DELETE/POST

    2019独角兽企业重金招聘Python工程师标准>>> 在平时开发中我们可能采用的习惯通常为以下方式: 1.查询使用GET请求.添加数据POST(这点是没错的)但是删除数据和更新数据 ...

  2. restful和rest_HATEOAS的RESTful服务:JVM上的REST API和超媒体

    restful和rest 1.简介 到目前为止,我们已经花了很多时间谈论了相当数量的关于角色的的超媒体和HATEOAS在REST风格的 Web服务和API,扫视不同规格和可用性方面. 听起来好像支持超 ...

  3. python restful风格_总结python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法

    python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法 这两天在用python的bottle框架开发后台管理系统,接口约定使用RESTful风格请求,前 ...

  4. IIS支持http协议的:put、delete等方法

    HTTP常见方法:DELETE, GET, HEAD, OPTIONS, POST, PUT, PATCH 以下是从网上搜索的方法:其实经过测试,只配置最后那个web.config就可以实现这个功能: ...

  5. ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解

    ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解 原文 ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解 在教程的这一部分,我们将研究一 ...

  6. C++:new[]和delete[]一定要配对使用吗?

    转载自公众号:程序喵大人 在平时资料中,我们常看到:new和delete,new[]和delete[]一定要配对使用! 也有人说:有时候不配对使用也不会出现问题. 那就研究下这个问题: 首先,看下这段 ...

  7. 删除hdfs上的内容报错:rm: Cannot delete /wxcm/ Name node is in safe mode.

    问题:在执行删除hdfs上的内容时(hdfs dfs -rm -f -r -skipTrash /wxcm)报错:rm: Cannot delete /wxcm/ Name node is in sa ...

  8. pandas中drop用法_机器学习笔记:Pandas的delete、drop函数的用法

    机器学习笔记:Pandas的delete.drop函数的用法 目录drop函数 Axis(轴)含义 drop用法实验 delete函数 drop函数 DataFrame.drop(labels=Non ...

  9. MySQL中的删除:drop,delete,truncate的区别和联系

    MySQL中drop,delete,truncate都可以用于删除,那么它们之间的区别是什么呢?首先我们先来学习一下这三个命令.注:本篇文章主要介绍对于表的删除 一.drop命令 drop是DDL(数 ...

最新文章

  1. 关于STM32像EPROM一样可以单字节写内部Flash的理解
  2. Linux练习(write写入)
  3. MySQL中using的用法
  4. 转机器学习系列(9)_机器学习算法一览(附Python和R代码)
  5. java 分贝_java11教程--jhsdb命令
  6. 前端学习(2580):提升开发效率的工具
  7. 感谢前任程序员赏饭吃!
  8. 人工智能作业考试汇总
  9. Junit框架使用(4)--JUnit常用断言及注解
  10. MySQL/mariadb从删库到跑路——备份
  11. 数字通信系统的组成框图
  12. 本地测试用的帐号csv文件
  13. iphone/ipad 横竖屏切换
  14. 词根词缀【-vict=vinc】
  15. visual studio (VS)中文转英文(英文转中文)
  16. Appium+夜神模拟器模拟人为操作
  17. 蓝桥杯个人总结(入门练习-VIP题)
  18. (小白鼠喝药问题)1000瓶药水,其中有一瓶是有毒的,如何找出有毒的药水?
  19. Eclipse在官网下载页面打不开
  20. substr函数功能

热门文章

  1. Ubuntu开发者峰会在布拉格举行
  2. 二月草的博客开通啦……
  3. Visual Stdio 注册表相关路径
  4. NGUI_2.6.3_系列教程二
  5. AndroidStudio_android通过服务,检测本程序是否已经终止运行_终止运行后发送通知给Http服务器---Android原生开发工作笔记246
  6. AndroidStudio_开发工具调试入门---Android原生开发工作笔记70
  7. Netty工作笔记0029---NIO 网络编程应用--群聊系统4--客户端编写2
  8. GDI+ 透明窗口.UpdateLayeredWindow
  9. 机器学习与计算机视觉(FPGA的图像处理方法)
  10. linux下的C语言开发(进程创建)