该内容整理自《Java RESTful Web Service实战》-第二版,读书笔记。
首先需要说明两个概念:安全性和幂等性,然后从这两个角度分析每一个方法
安全性:指外系统对该接口的访问,不会使服务器端资源的状态发生改变。有写动作的HTTP方法都不是安全性的。
幂等性:指外系统对同一REST接口的多次访问,得到的资源状态是一样的。
安全性 | 幂等性 | 作用 | |
GET | 是 | 是 | 读取资源 |
PUT | 否 | 是 | 写操作,用于更新或添加资源 |
POST | 否 | 否 | 写操作。RPC中的写操作均使用POST,REST中只使用HTTP中的POST更新资源 |
DELETE | 是 | 根据主键删除数据 |
GET方法:
用于读取资源。
幂等性:是。因为读取同一个资源,总是得到相同的数据。
安全性:是。因为读取资源不会对其状态做改动。
PUT方法:
是一种写操作的HTTP请求。REST使用HTTP的PUT方法更新或添加资源。
在创建和更新某个资源的时候,开发者比较迷茫的是何时该使用HTTP的PUT方法,何时该使用POST方法。
为了解决该问题,我们首先分析PUT的特性:
PUT是幂等的,即多次插入或者更新同一份数据,在服务器端对资源状态产生的改变是相同的。
PUT是不安全的,有些动作的HTTP方法都是不安全的。
更新:由于使用同一份数据向服务器请求更新某一资源,得到的结果总是相同的,因此对于更新操作,使用PUT没有疑问。
创建:创建操作通常每次得到的结果是不同的,因为服务器端的业务层逻辑通常要求数据的主键字段要么来自于业务自增一个逻辑值,要么来自于数据库的主键自增。因此,相同的数据每次一提交到服务器端,都会为数据添加一个新的主键值,也就是创建一个主键不同的资源(如果没有业务或者外键冲突)。所以,创建操作应该设计为POST方法的API。
唯有一种情况应该使用PUT方法来设计API,即客户端在发起创建请求时,在同一份数据中总可以提供唯一的主键值,服务器不会对其进行修改,这样创建请求确保了幂等性,不应再使用POST方法。
DELETE方法:
DELETE是幂等的,即多次删除同一份数据(通常请求中传递的参数是数据的主键值),在服务器端产生的改变也是相同的。
执行删除资源方法时,其返回值可以定义为void,即该方法没有返回值。因为删除的前提是对该资源信息已经充分了解,没有必要再将其从服务器上传递回来。
POST方法:
POST方法是一种写操作的HTTP请求。RPC的所有写操作均使用POST方法,而REST只是用POST方法添加资源。
既不幂等也不安全:因为请求会改变服务器端的资源状态,因此是不安全的;每次请求对服务器端资源状态的改变并不是相同的,因此也不是幂等的。