这两个方法咋一看都可以更新资源,但是有本质区别的

具体定义可以百度,我这里就不贴了,光说我自己的理解

首先解释幂等,幂等是数学的一个用语,对于单个输入或者无输入的运算方法,如果每次都是同样的结果,则称其是幂等的

对于两个参数,如果传入值相等,结果也等于每个传入值,则称其为幂等的,如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的更多相关文章

  1. 如何使用开源库,吐在VS2013发布之前,顺便介绍下VS2013的新特性"Bootstrap"

    刚看到Visual Studio 2013 Preview - ASP.NET, MVC 5, Web API 2新功能搶先看 看了下VS2013带来的"新特性",直觉上看,除了引 ...

  2. 如何使用开源库,吐在VS2013发布之前,顺便介绍下V2013的新特性"Bootstrap"

    如何使用开源库,吐在VS2013发布之前,顺便介绍下VS2013的新特性"Bootstrap" 刚看到Visual Studio 2013 Preview - ASP.NET, M ...

  3. css基础--深入理解opacity和rgba的区别

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 首先这两个都与透明度有关,那么他们之间有什么具体的区别呢?在实际工作中我们需要注意什么呢?请您接着往下看 语法 1. rg ...

  4. 理解%r和%s的区别

    理解%r和%s的区别 %r会重现所表达的对象,%s会将所有转成字符串 eg1: print('i am %s years old' % 22) print('i am %r years old' % ...

  5. 理解ArrayList与LinkedList的区别

    一.先来看看ArrayList与LinkedList 在JDK中所在的位置 从图中可以看出,ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只 ...

  6. IL角度理解for 与foreach的区别——迭代器模式

    IL角度理解for 与foreach的区别--迭代器模式 目录 IL角度理解for 与foreach的区别--迭代器模式 1 最常用的设计模式 1.1 背景 1.2 摘要 2 遍历元素 3 删除元素 ...

  7. 理解HTTP和HTTPS的区别

    原问转载于https://www.mysubmail.com/chs/blog/view/47 这两天闲来无事,在网上看了一下,发现 HTTP 和 HTTPS 的区别很受关注,多位大牛做了很详细的阐述 ...

  8. Java Socket实现HTTP客户端来理解Session和Cookie的区别和联系

    HTTP协议本身是无状态的,即使是同一台电脑同一个浏览器打开同一个页面两次,服务器不知道这两次请求是同一个客户端发送过来的,两次请求是完全独立的.例如,第一次请求时已经登录了,第二次再请求服务器会“忘 ...

  9. 【前端基础系列】理解GET与POST请求区别

    语义区别 GET请求用于获取数据 POST请求用于提交数据 缓存 GET请求能被缓存,以相同的URL再去GET请求会返回304 POST请求不能缓存 数据长度 HTTP协议从未规定过GET/POST请 ...

随机推荐

  1. js 拼接字符串 穿参数 带有单引号

    var html="<a href=\"#\"  onclick=Unlock(\""+flid+"\",1)>弹出& ...

  2. KMP + 求最小循环节 --- HUST 1010 - The Minimum Length

    The Minimum Length Problem's Link: http://acm.hust.edu.cn/problem/show/1010 Mean: 给你一个字符串,求这个字符串的最小循 ...

  3. JavaBeans 官方文档学习

    提示,重点:JavaBeans的Property和 Events:PropertyEditor极其注册和查找机制. 从目前来看,JavaBeans 更像是源自GUI的需求. 使用NetBeans新建一 ...

  4. php -- each()、list()

    1.each的用法 先看API:array each ( array &$array ) api里是这么描述的:each — 返回数组中当前的键/值对并将数组指针向前移动一步 我们先来看看返回 ...

  5. linux基础教程---内容操作

    一.寻找文件里的指定内容 寻找文件里的指定内容,输出内容所在行的所有信息 grep    被搜索内容    文件路径名 >grep     var       passwd       //在 ...

  6. UIViewController三种不同的初始化view的方式

    You can specify the views for a view controller using a Storyboard created in Interface Builder. A s ...

  7. Jhipster token签名异常——c.f.o.cac.security.jwt.TokenProvider : Invalid JWT signature.

    背景,jHipster自动生成的springBoot和angularJs前后台端分离的项目.java后台为了取到当前登录者的信息,所以后台开放了 MicroserviceSecurityConfigu ...

  8. MySQL--执行mysql脚本及其脚本编写

    http://www.cnblogs.com/kex1n/archive/2010/03/26/2286504.html

  9. 如何隐藏js

    前端好像一直会遇到js容易被查看的问题,针对这种情况,如何隐藏js呢? 突发奇想,想到一个办法,如果说一段js只需要执行一次的话 可以尝试在所有js加载操作完毕后把它去掉.看代码 <!DOCTY ...

  10. SQL Server计算列

    计算列由可以使用同一表中的其他列的表达式计算得来.表达式可以是非计算列的列名.常量.函数,也可以是用一个或多个运算符连接的上述元素的任意组合.表达式不能为子查询. 例如,在 AdventureWork ...