REST API命名约定创建或更新资源的最佳实践

REST API命名约定创建或更新资源的最佳实践,rest,api-design,specifications,Rest,Api Design,Specifications,在我的应用程序中,客户机可以创建我们计算ID并将其分配给资源的资源 但是,客户机也可以为每个资源引用它想要使用的特定ID(我们称之为外部ID),这样我们就不会强制客户机只使用我们的ID 然后我们有以下端点: POST/resources/在有效负载中创建具有可选外部_id的资源 PUT/resources/:更新资源的id 我们希望允许客户端使用其外部ID更新资源 PUT/resources/create\u或\u update/:external\u id,但至少可以说,我们对端点的名称

在我的应用程序中,客户机可以创建我们计算ID并将其分配给资源的资源

但是,客户机也可以为每个资源引用它想要使用的特定ID(我们称之为外部ID),这样我们就不会强制客户机只使用我们的ID

然后我们有以下端点:

  • POST/resources/在有效负载中创建具有可选外部_id的资源
  • PUT/resources/:更新资源的id
我们希望允许客户端使用其外部ID更新资源

  • PUT/resources/create\u或\u update/:external\u id,但至少可以说,我们对端点的名称不是很满意
根据REST最佳实践,您是否有更好的名称的想法

根据REST最佳实践,您是否有更好的名称的想法

REST不关心资源标识符的拼写。(演示:URL缩短器没有破坏web。)

如果您在两个不同的层次结构中拥有资源-一个是您在拼写方面拥有完全的自主权,另一个是客户机拥有一些控制权,那么

/09bce7a1-1f00-4bb4-8f72-8f642295a73e/:id
/8f3b9dc8-90de-48c5-aa96-a3f5a8d8e8ee/:external_id
。。。很好

可以为层次结构中的路径选择任何语义拼写

因为REST不在乎,所以你需要到其他地方寻求指导。本地编码约定是一个很好的起点,但您可能不会问您是否已经有了这样的东西可以参考。也许是市场营销?也许他们可以从中制造一些东西

/bronze/:id
/superUltraPlatinumPlus/:external_id
根据REST最佳实践,您是否有更好的名称的想法

REST不关心资源标识符的拼写。(演示:URL缩短器没有破坏web。)

如果您在两个不同的层次结构中拥有资源-一个是您在拼写方面拥有完全的自主权,另一个是客户机拥有一些控制权,那么

/09bce7a1-1f00-4bb4-8f72-8f642295a73e/:id
/8f3b9dc8-90de-48c5-aa96-a3f5a8d8e8ee/:external_id
。。。很好

可以为层次结构中的路径选择任何语义拼写

因为REST不在乎,所以你需要到其他地方寻求指导。本地编码约定是一个很好的起点,但您可能不会问您是否已经有了这样的东西可以参考。也许是市场营销?也许他们可以从中制造一些东西

/bronze/:id
/superUltraPlatinumPlus/:external_id

所以最后我们决定

PUT /resources/by_external_id/:external_id
这是我们提出的基于客户机引用更新资源的“最差选项”。虽然仍然可以使用我们的参考更新资源:

PUT /resources/:id
正如一个答案所暗示的那样,我们本可以选择

PUT /resources/:external_id
PUT /resources/:id
但由于外部_id和id可能使用相同的格式(UUID),这可能会影响我们的性能(首先检查该值是否不作为id存在,如果是,则检查它是否可以是外部_id)


其中一条评论中也提到了这一点,但我们不想使用查询参数。

所以最后我们决定使用

PUT /resources/by_external_id/:external_id
这是我们提出的基于客户机引用更新资源的“最差选项”。虽然仍然可以使用我们的参考更新资源:

PUT /resources/:id
正如一个答案所暗示的那样,我们本可以选择

PUT /resources/:external_id
PUT /resources/:id
但由于外部_id和id可能使用相同的格式(UUID),这可能会影响我们的性能(首先检查该值是否不作为id存在,如果是,则检查它是否可以是外部_id)


其中一条评论中也提出了这一点,但我们不想使用查询参数。

可能
PUT/resources/{the id}?id type={external | internal}
?“最佳实践”声明您不应该在URI中使用
create
update
之类的动词,尽管遵循REST体系结构的应用程序并不真正关心URI是如何构成的,只要它符合。类似于我们人类,他们更喜欢关系名称中链接内容的描述性摘要,应用程序与此类似,它们应该使用链接关系名称来确定URI的意图,而不是试图从URI解析链接的含义。您会更新/替换完全完整的资源还是只更新其中的一个或几个字段?因为这是一个PUT,我们将根据payloadMaybe
PUT更新完整的资源/参考资料/{id}?id type={external | internal}
?“最佳实践”会指出,您不应该在URI中使用
create
update
之类的动词,尽管遵循REST体系结构的应用程序并不真正关心URI是如何构成的,只要它符合标准。类似于我们人类,他们更喜欢关系名称中链接内容的描述性摘要,应用程序与此类似,它们应该使用链接关系名称来确定URI的意图,而不是试图从URI解析链接的含义。您会更新/替换完全完整的资源还是只更新其中的一个或几个字段?因为这是一个PUT,所以我们将根据负载更新完整的资源