REST API - PUT还是POST?

6
可能重复:
REST中的PUT vs POST 我知道这个问题被讨论了很多次,虽然我有点理解,但不完全明白。如果有人能用下面的例子回答这个问题,那么就容易理解了。
创建新用户 - 向数据库添加一个新用户,发送用户名、密码、电子邮件。 PUT还是POST?
我认为应该使用PUT,因为我不想有重复的用户,PUT是删除和替换的意思。但是,我进行了检查,避免了用户被添加两次,所以也许应该使用POST?
更新用户 - 更改电子邮件或密码。 PUT还是POST?
我可以使用URI api/update/my_username,然后通过body发送新的电子邮件,所以应该使用PUT吗? 我也可以通过 URI 将它们全部发送 e.g. api/update/my_username/email/new_email@email.com
2个回答

11

创建 - POST,更新 - PUT,删除 - DELETE。

为了更好地理解HTTP动词的用法,请查看RFC https://www.rfc-editor.org/rfc/rfc2616

此外,PUT请求可以创建实体,但是响应代码应该是201 Created而不是200 OK和204 No Content。但是,是否允许/实现此类行为取决于您。


我认为电子邮件是在正文还是URI中并不重要,至少从安全的角度来看不重要。如果你能读取头部信息,那么你也可以读取正文。 - Vala
在第一次了解REST时,我决定创建-POST,更新-PUT,删除-DELETE,但事实并不是那么简单。http://jcalcote.wordpress.com/2008/10/16/put-or-post-the-rest-of-the-story/ - Paul Benbow
@Thor84no 是的,这并不重要,但是当电子邮件进入URI时,即使使用HTTPS也有可能被嗅探到。 - Regfor
假设我不通过URI发送任何数据,而是全部放在Body中。如果我创建一个唯一的新用户,那么应该使用PUT而不是POST吗?@Regfor - Paul Benbow
1
没有在Uri中的电子邮件与主要问题无关。所以再说一遍:当您没有实体ID时,使用post-创建;当您有实体和ID时,请使用put-更新,但它可以创建嵌套实体。 - Regfor
显示剩余3条评论

2
关键指南是操作是否幂等,即如果您重复执行该操作会发生什么。如果无论您执行请求一次,两次还是20次,总体上发生的事情相同(忽略日志、最后更改时间和其他琐碎细节),则它是幂等的,应该使用PUT。如果执行次数很重要,则使用POST。
创建通常是非幂等的,因为通常会向用户发出ID,但不必如此(例如,如果调用者指定了ID)。更新通常是幂等的,因为将数据字段更改为其当前值在实践中通常是有效的无操作。

"关键指南是操作是否幂等。如果我使用POST创建新用户,但加入规则以防止重复的电子邮件和用户名,那么由于规则的存在,它变得幂等了,不是吗?" - Paul Benbow
如果您有阻止重复电子邮件等违规行为的规则,则这些规则的违反应该改变结果。在第一次创建时,应该创建一个新实体并得到200 OK响应作为结果,在随后的操作中,您会期望不会创建任何实体(不同的结果)并出现400 BAD REQUEST(带有错误消息),因此它仍然不是幂等的。 - Vala
Thor84no - 好的,我理解了创建用户的场景。那么如果只更新现有用户的电子邮件地址呢?如果我不断使用更新后的电子邮件发送相同的请求,那么什么都不会改变,因为相同的更新后的电子邮件被发送,所以它是幂等的,因此是PUT。 - Paul Benbow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接