我认为设计一个使用PUT和DELETE来更新和删除数据的REST API服务并没有太大的好处。这两个动词可以很容易地被一个POST和唯一的URL所替代。
我唯一能看到使用PUT和DELETE的好处是减少了REST API服务使用的URL数量,但这并不多。我是否忽视了其他好处?
我认为设计一个使用PUT和DELETE来更新和删除数据的REST API服务并没有太大的好处。这两个动词可以很容易地被一个POST和唯一的URL所替代。
我唯一能看到使用PUT和DELETE的好处是减少了REST API服务使用的URL数量,但这并不多。我是否忽视了其他好处?
GET /api/books/123
返回书籍资源的表示形式,则开发人员期望能够在同一URL上调用PUT
以更新有关该书籍的信息,并使用DELETE
从中删除该书籍。 (当然,如果他没有权限这样做,您实际上不会删除该书籍,而是返回403“禁止”或405“方法不允许”的状态代码-这些也是HTTP规范的一部分)POST /api/books/123/remove/the/book
而不是DELETE /api/books/123
。他们必须了解您API的所有自定义规则,因为您没有遵循标准。GET
应该是一种“安全方法”,用于检索信息而不对服务器端进行任何更改。而PUT
和DELETE
是幂等的,这意味着(尽管它们不像GET
那样是“安全”方法),您可以随意发出多个请求而没有任何不必要的副作用(删除一本书一次或十次具有相同的效果:书被删除)。然而,POST
不是幂等的:如果您执行十个POST
请求来创建一本新书,您很可能会得到10个重复的书目录。GET
请求,以避免在服务器上破坏任何东西。但是,如果您违反HTTP规范,例如使用URL http://example.com/api/books/123/delete
来删除一本书,您可能会注意到有一天您的数据库完全为空,因为Google一直在索引您的网站。那不是Google的错,而是您的错,因为您没有遵循规范。
所以长话短说:使用协议或标准(如HTTP)会产生某些期望,如果您偏离了协议,就会创建意外行为和可能的不良副作用。
您可以不使用PUT和DELETE。
本文告诉您为什么: http://www.artima.com/lejava/articles/why_put_and_delete.html
但是(引用自Fielding):“REST API不应该包含除填充或修复标准协议的细节之外的任何通信协议更改,例如HTTP的PATCH方法或Link头字段。针对已损坏实现的解决方法(如那些愚蠢到相信HTML定义了HTTP的方法集的浏览器)应单独定义,或者至少在附录中定义,并期望这种解决方法最终会过时。[在这里失败意味着资源接口是特定于对象而不是通用的。]”(http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven)