« 愤怒 | 首页 | 都靈 »

夜猫子

留言(2 条)

理解RESTful架构 留言:


引用Linyang的发言:



没错,你是可以把post /users/1 实现为幂等的。但是通用客户端,比如浏览器,没有这样的预先假设。当post 操作异常时,比如超时,服务器503等等,浏览器是不能自动重试post操作的。这样你的幂等的 post /users/1 并没有给你带来太多的好处,除非你的客户端都是定制客户端

REST确实不是技术标准,但是HTTP是标准。




HTTP标准没有真正得到落实

现在其实处于一个“尴尬”的状况,一方面REST已经从理论上提供了解决方向,另外一方面是实际环境其实还没有提供足够多的REST支持。

比如通过ajax,大多数(?)浏览器可以发出原生的PUT/DELETE方法,不使用ajax,
就只能GET/POST。

实际开发中,没有谁敢保证浏览器可以发出真的PUT,也没有谁敢保证web服务器可以理解真正的PUT,即使web服务器可以理解,也不能保证服务器端开发语言能够理解(比如php有$_GET,$_POST,但是没有$_PUT)

所以PUT/DELETE方法好些时候其实是通过POST模拟的,常见的方法有两种

<form method="post">
<input type="hidden" name="_method" value="put"/>
</form>


或者request message包括自定义的http header,一般是X-HTTP-METHOD-OVERRIDE: PUT

POST/PUT是否幂等,只能由你的程序来保证,并没有实际的支撑,具体选择POST还是PUT,其实就是一种约定或者规范。

PS:写到后面我有点觉得自己在说废话……

理解RESTful架构 留言:


引用阮一峰的发言:


PUT是幂等方法,POST不是。所以PUT用于更新、POST用于新增比较合适。



具体的程序逻辑里面,完全可以把POST动作实现为幂等操作,比如POST /user 创建新用户,POST /user/1 修改id为1的用户信息,无论POST /user/1多少次,都是对id为1的用户进行修改(幂等)。

真正的理由是,REST仅仅是一种架构风格的指导规范,并非具体技术实现。因此用POST新建,PUT修改仅仅是具体实施过程中的约定。就像代码需要合理的缩进一样,虽然不缩进,程序也能执行(python除外),但安装这个约定去做,事情可以做得更漂亮点。
我也看到过其它的REST文章建议说POST修改,PUT新建,我更倾向于POST新建,PUT修改。