(转)理解POST和PUT的区别,顺便提下RESTful
这两个方法咋一看都可以更新资源,但是有本质区别的
具体定义可以百度,我这里就不贴了,光说我自己的理解
首先解释幂等,幂等是数学的一个用语,对于单个输入或者无输入的运算方法,如果每次都是同样的结果,则称其是幂等的
对于两个参数,如果传入值相等,结果也等于每个传入值,则称其为幂等的,如min(a,b)
POST
用于提交请求,可以更新或者创建资源,是非幂等的
举个例子,在我们的支付系统中,一个api的功能是创建收款金额二维码,它和金额相关,每个用户可以有多个二维码,如果连续调用则会创建新的二维码,这个时候就用POST
PUT
用于向指定的URI传送更新资源,是幂等的
还是那个例子,用户的账户二维码只和用户关联,而且是一一对应的关系,此时这个api就可以用PUT,因为每次调用它,都将刷新用户账户二维码
比如一个接口用于用户生成,接收的数据是用户名、密码等相关信息,则用POST
RESTful建议所有的URI都是对应资源,所以创建用户不应该理解为一个行为,在此将此接口命名为:
/user/creation
每次调用它都会新建一个用户(假定用户名可以重复)
而PUT方法更加关心一个具体资源对应的URI,比如更新当前用户信息,这里可以用PUT
/user/me/update
这里用me来指代当前用户,如果是针对更多用户适用的接口,可以考虑
/user/{uid}/update
注意多次调用同一接口,只要提交的数据一致,用户信息每次结果就会一致,即产生同样的结果:服务器端某个具体的资源得到了更新
当需要以更新的形式来修改某一具体资源的时候,如何判断用PUT还是POST呢?
很简单,如果该更新对应的URI多次调用的结果一致,则PUT
比如更新某个blog文章,因为该文章具有单一的具体URI,所以每次更新提交相同的内容,结果都一致
/blog/{document_id}/update
在每次更新提交相同的内容,最终的结果不一致的时候,用POST
举个很常见的例子,一个接口的功能是将当前余额减一个值,每次提交指定该值为100,接口如下
/amount/deduction
调用一次,你的余额-100,调用两次,余额-200
这个时候就用POST
RESTful的4种层次
Representational status transfer
个人理解为:表现形式的状态传递
1、只有一个接口交换xml来实现整个服务
目前我们的移动站点的服务就是类似的结构,我们有两个URI接口/mapp/lead和/msdk/safepay
2、每一个资源对应一个具体的URI,比1好维护,但是问题依然很明显,资源版本更新会引入时间戳维护,资源的获取和更新修改必须对应不同的URI
目前PC主站和移动站点的静态内容(包括html文件)都是这种形式
3、在2的基础上使用了http verb,每个URI可以有不同的动作,充分利用了http协议,所以自然居然http协议的完整优势,比如缓存和健壮性
HTML4.0只支持POST和GET,所以无论DELETE还是PUT操作,都用POST去模拟了
在WEB开发者看来,就是如果有数据变动,就用POST,如果没有,就用GET
所以目前中国用户来看,PC端实现RESTful很困难,只有移动端支持Html5的浏览器,才能让前端做出尝试
4、现在似乎更加无法实际应用,Hypemedia control,也就是RESTful的本意,合理的架构原理和以网络为基础的设计相结合,带来一个更加方便、功能强大的通信架构
这就有点虚无缥缈了,不过是一个努力的方向,想想看,以后要缴水费了,打开浏览器,输入我要缴水费,就自动定位+自动下单+自动付款+自动展示结果,完成整个缴水费的过程,这是多么方便的领悟!gwy要失业了有木有,那帮吃白饭做很简单的事情的,生产力发展第1个要淘汰的就是阻碍生产力发展的落后生产关系……
(转)理解POST和PUT的区别,顺便提下RESTful的更多相关文章
- 如何使用开源库,吐在VS2013发布之前,顺便介绍下VS2013的新特性"Bootstrap"
刚看到Visual Studio 2013 Preview - ASP.NET, MVC 5, Web API 2新功能搶先看 看了下VS2013带来的"新特性",直觉上看,除了引 ...
- 如何使用开源库,吐在VS2013发布之前,顺便介绍下V2013的新特性"Bootstrap"
如何使用开源库,吐在VS2013发布之前,顺便介绍下VS2013的新特性"Bootstrap" 刚看到Visual Studio 2013 Preview - ASP.NET, M ...
- css基础--深入理解opacity和rgba的区别
欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 首先这两个都与透明度有关,那么他们之间有什么具体的区别呢?在实际工作中我们需要注意什么呢?请您接着往下看 语法 1. rg ...
- 理解%r和%s的区别
理解%r和%s的区别 %r会重现所表达的对象,%s会将所有转成字符串 eg1: print('i am %s years old' % 22) print('i am %r years old' % ...
- 理解ArrayList与LinkedList的区别
一.先来看看ArrayList与LinkedList 在JDK中所在的位置 从图中可以看出,ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只 ...
- IL角度理解for 与foreach的区别——迭代器模式
IL角度理解for 与foreach的区别--迭代器模式 目录 IL角度理解for 与foreach的区别--迭代器模式 1 最常用的设计模式 1.1 背景 1.2 摘要 2 遍历元素 3 删除元素 ...
- 理解HTTP和HTTPS的区别
原问转载于https://www.mysubmail.com/chs/blog/view/47 这两天闲来无事,在网上看了一下,发现 HTTP 和 HTTPS 的区别很受关注,多位大牛做了很详细的阐述 ...
- Java Socket实现HTTP客户端来理解Session和Cookie的区别和联系
HTTP协议本身是无状态的,即使是同一台电脑同一个浏览器打开同一个页面两次,服务器不知道这两次请求是同一个客户端发送过来的,两次请求是完全独立的.例如,第一次请求时已经登录了,第二次再请求服务器会“忘 ...
- 【前端基础系列】理解GET与POST请求区别
语义区别 GET请求用于获取数据 POST请求用于提交数据 缓存 GET请求能被缓存,以相同的URL再去GET请求会返回304 POST请求不能缓存 数据长度 HTTP协议从未规定过GET/POST请 ...
随机推荐
- 梯度下降算法到logistic回归
http://sbp810050504.blog.51cto.com/2799422/1608064/ http://blog.csdn.net/dongtingzhizi/article/detai ...
- 一个线程可以拿到多个锁标记,一个对象最多只能将monitor给一个线程
当用Synchronized修饰某个方法的时候,表示该方法都对当前对象加锁. 给方法加Synchronized和用Synchronized修饰对象的效果是一致的. 一个线程可以拿到多个锁标记,一个对象 ...
- Apache -- 压力测试工具ab.exe
ab全称ApacheBench是Apache超文本传输协议(HTTP)的性能测试工具.是描绘当前所安装的Apache的执行性能, 主要是显示你安装的Apache每秒可以处理多少个请求Apache自带的 ...
- SQL UNIQUE Constraint
SQL UNIQUE Constraint The UNIQUE constraint uniquely identifies each record in a database table. The ...
- 学习《深入理解C#》—— 可空类型、可选参数和默认值 (第一章1.3)
目录 C#可空类型 C# 可选参数和默认值 C# 可空类型 在日常生活中,相信大家都离不开手机,低头族啊!哈哈... 假如手机厂商生产了一款新手机,暂时还未定价,在C#1中我们该怎么做呢? 常见的解决 ...
- ios开发之 -- 5分钟集成融云的客服功能
最近项目中遇到了客服的功能,首先想到的就是使用融云的功能,因为以前做的即时通讯的项目,用的都是融云的sdk,花了点时间研究了下,希望能帮到大家! 废话不多说,步骤如下: 一.申请融云账号 二.创建应用 ...
- px像素单位与IOS像素单位的换算
本文转载至 http://blog.csdn.net/fanyuna/article/details/24032663 30px转成磅为单位=22磅=二号 磅=(像素/96)*72 =(30/96) ...
- 一个网络设备的常见功能--连通性检查SSRF漏洞--被黑客利用当做扫描器
一.我们先来看一下很多网络设备都有的一个常见功能--连通性测试: 很多网络设备都具备与其他设备通信,联动的功能,例如网络设备联动安全设备,网络设备联动认证设备等等.此时都需要一个对端IP和对端端口号作 ...
- 【BZOJ4563】[Haoi2016]放棋子 错排+高精度
[BZOJ4563][Haoi2016]放棋子 Description 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍 ...
- Vue基础-自定义事件的表单输入组件、自定义组件的 v-model
Vue 测试版本:Vue.js v2.5.13 学习 Vue 的自定义事件的表单输入组件,觉得文档讲的不太细致,所以这里再细化一下: 如果不用 v-model,代码应该是这样: <myinput ...