考虑下面的API,它应该是RESTful
我想要创建UserStores,其中的用户可以是多个UserStores,每个UserStores都可以包含多个用户。
PUT /userStores/store1
使用id store1
创建一个空的用户存储,如果它已经存在,什么也不做。
PUT /userStores/store1 -content { "userName":"John", "more":"details" }
使用id store1
在用户存储中创建用户,如果该存储不存在,则将创建该存储。如果存储和用户已经存在,则将更新用户详细信息。
GET /userStores/store1
使用id store1
列出用户存储区中的所有用户
GET /userStores/store1/John
获取id John
存储中具有名称store1
的用户的表示形式。
你认为这个API RESTful吗?(遵守其余原则)
( b)在案例1和2中,我根据PUT
请求的内容来决定是创建用户存储还是创建用户。你对此有何看法?
c)关于案例2,如果这两种资源都不存在,那么是否可以使用单个UserStore操作创建父PUT
资源以及用户资源?
发布于 2018-01-21 05:00:09
您认为这个API RESTful吗?(遵守其余原则)
不;您使用的放方法与HTTP的统一接口不一致。
PUT方法请求创建目标资源的状态或将其替换为由请求消息有效负载中包含的表示定义的状态。
只有在请求中提供的表示与服务器上的资源状态匹配时,PUT才应该是非操作。
给定表示的成功放置将意味着后续的GET在同一目标资源上将导致在200 (OK)响应中发送一个等效的表示。
如果希望创建一个在资源已经存在的情况下不执行任何操作的创建,那么要使用的正确拼写是一个条件PUT,可能使用的是如果-没有-匹配头
PUT /userStores/store1 -content { "userName":"John", "more":"details" }
这可能不像您想做的那样,正如消息的语义所说的,要更新存储,使John在其中,而没有其他人在其中。
如果您试图添加或更新John
而不影响存储中的任何其他用户,那么PUT有错误的语义;您需要帖子或补丁。
我根据PUT请求的内容来决定是创建用户存储还是创建用户。你对此有何看法?
使用PUT,您要更新URI中指定的资源的语义总是。您的服务器实现需要做的是实现更新,这是它自己的问题-- REST并不关心您的存储是一个包含大量用户详细信息的大型文档,或者是一堆共享外键的用户记录,或者其他什么。这是资源抽象的一部分:客户端没有耦合到服务器的实现。
如果这两种资源都不存在,那么是否可以用一个PUT操作创建父UserStore资源以及用户资源?
这很好。
发布于 2018-01-21 04:05:50
好的,我期望创建存储,或者在使用PUT时覆盖已经存在的存储,如果在存储已经存在时不想发生任何事情,我宁愿使用POST,PUT应该是幂等的,因此:
( a)是的,如果PUT创建或覆盖已有的存储区
( b)如上
( c)是的,但以下是我所说的
发布于 2018-01-21 04:10:37
将REST
应用于HTTP
方法的最佳使用,总是建议使用POST
来创建资源。这有两个原因:
POST
方法的请求都会创建一个资源,而该资源是用于此目的的最佳HTTP
方法。PUT
是一种幂等请求/响应方法。如果应用程序试图创建系统中已经存在的资源,这将失败。因此,从定义和实际使用来看,建议使用POST
来创建资源,而不是使用PUT
。
在这个解释之后,回答你的问题:
但在我看来,您的所有情况都不能完全称为RESTful,您的API需要在基本逻辑本身中进行大量维护!
希望这能很好地回答你的问题!
https://stackoverflow.com/questions/48366358
复制相似问题