考虑以下应该是RESTful的API
我想在其中创建UserStores和Users 可以有多个UserStore,每个UserStore都可以包含多个用户。
PUT /userStores/store1
创建一个标识为store1
的空用户存储,如果已存在则不执行任何操作
PUT /userStores/store1 -content { "userName":"John", "more":"details" }
在用户存储中创建标识为store1
的用户,如果该商店不存在,则会创建该用户。如果商店和用户已存在,则将更新用户详细信息。
GET /userStores/store1
列出标识为store1
GET /userStores/store1/John
获取ID为John
的商店中名称为store1
的用户的表示
a)您认为这个API是RESTful吗? (遵守REST原则)
b)在案例1和案例2中,我根据PUT
请求的内容决定是否应创建用户商店或用户。你对此持何看法?
c)关于案例2,如果两个资源都不存在,是否可以创建父UserStore资源以及具有单个PUT
操作的用户资源?
答案 0 :(得分:1)
您认为此API是RESTful吗? (遵守REST原则)
没有;您使用PUT方法与HTTP的统一接口不一致。
PUT方法请求创建目标资源的状态,或者用请求消息有效负载中包含的表示定义的状态替换目标资源的状态。
只有当请求中提供的表示与服务器上的资源状态匹配时,PUT才应该是无操作。
给定表示的成功PUT将表明对同一目标资源的后续GET将导致在200(OK)响应中发送等效表示。
如果您希望 create 在资源已经存在的情况下不执行任何操作,那么要使用的正确拼写是条件PUT,可能使用If-None-Match标题
PUT /userStores/store1 -content { "userName":"John", "more":"details" }
这可能不会达到您想要的效果,因为消息的语义表示更新商店,以便John在其中而其他人。
如果您尝试添加或更新John
而不影响商店中的任何其他用户,则PUT具有错误的语义;您需要POST或PATCH。
我根据PUT请求的内容决定是应该创建用户商店还是用户。你对此持何看法?
使用PUT,语义始终是您正在更新URI中指定的资源。您的服务器实现需要做什么来实现该更新是它自己关心的问题 - REST并不关心您的商店是一个存储在其中的一堆用户详细信息的大文档,还是如果它是一堆用户记录所有人都共享外键或其他任何东西。这是资源抽象的一部分:客户端没有耦合到服务器的实现。
如果两个资源都不存在,是否可以创建父UserStore资源以及使用单个PUT操作的User资源?
没关系。
答案 1 :(得分:0)
好吧,我希望创建商店或覆盖使用PUT时已经存在的商店,如果您希望在商店已经存在时没有任何事情发生,我宁愿使用POST,PUT应该是幂等的,因此:
a)是,如果PUT创建或覆盖已存在的商店
b)如上所述
c)是,但遵循我上面所说的
答案 2 :(得分:0)
REST
最好地使用HTTP
方法,始终建议POST
用于创建资源。这有两个原因:
POST
方法的每个请求都会创建一个资源,这是用于此目的的最佳HTTP
方法PUT
是幂等请求/响应方法。如果您的应用程序尝试创建系统中已存在的资源,则会失败。因此,根据定义和实际使用情况 - 始终建议您使用POST
来创建资源而不是PUT
。
继续这个解释回答你的问题:
但在我看来,你的案例都不能完全被称为RESTful,而你的API在基本逻辑本身中需要大量的维护!
希望这能很好地回答你的问题!