REST API 设计 - 单个通用端点或多个特定端点

REST API Design - Single General Endpoint or Many Specific endpoints

这是一个比较主观的问题,但我还是想听听别人的意见

我正在设计一个 REST Api,它将被内部系统(最多几个客户端应用程序)访问。

一般API需要更新不同汽车品牌的参数。每个汽车品牌都有大约 20 个属性,其中一些是所有汽车品牌共享的,一些是每个品牌特定的。

我想知道什么是更好的设计此 API 端点的方法。

  1. 我是否应该使用单个端点,它接收一个字符串 - 即汽车品牌所有属性的 JSON,以及汽车品牌的 ID。

  2. 或者我应该为每个汽车品牌提供一个单独的端点,它的主体具有该汽车品牌所需的确切属性。

所以在第一种方法中,我有一个端点,它有一个 string 参数,我希望它是一个 JSON 和所有必要的值

PUT /api/v1/carBrands/

而在第二种情况下的第二种方法中,我对每种汽车品牌都有一个端点,并且每个端点都有一个 类型的 dto 对象 代表它需要的所有值。

PUT /api/v1/carBrand/1
PUT /api/v1/carBrand/2
.
.
.
PUT /api/v1/carBrand/n

第一种方法似乎节省很多重复代码——毕竟唯一区别在于参数集。 但是,因为它接受任意字符串,最终用户无法知道他应该传递什么——他需要有人告诉他and/or read from documentation .

第二种方法可读性更高,任何人都可以填写数据,因为他们知道它是什么。但它主要涉及将相同的代码复制大约 20 次。

我真的很难选择一个选项,因为这两种方法都有其缺点。我该如何判断哪个更好

I am wondering what is a better approach to the design for the endpoints of this API.

根据您的示例,您似乎在询问 resource 设计,特别是您是应该使用一个大型资源还是一系列较小的资源。

REST 没有回答这个问题……无论如何,没有直接回答。 REST 所做的是识别缓存粒度处于 resource 级别。如果有两条信息,并且你想让一条信息失效也使另一条信息失效,那么这两条信息应该是同一个资源的一部分,也就是说它们应该使用相同的URI访问。

如果这不是您想要的,那么您可能应该倾向于使用分离的资源。

我不一定期望对 Ford 进行编辑会强制使我的本地副本 Ferrari 失效,因此这表明我可能希望将它们视为两个不同的 资源,而不是两个子资源.

比较

/api/v1/carBrands#Ford
/api/v1/carBrands#Ferrari

/api/v1/carBrands/Ford
/api/v1/carBrands/Ferrari

在前一种情况下,我的缓存中有一个资源 (/api/v1/carBrands);我对其所做的任何更改都会使整个资源无效。在后一种情况下,我缓存了两个资源;更改一个会忽略另一个。

使用其中之一并没有错误;两者都很好,并且有很多历史。他们做出了不同的权衡,一个或另一个可能更适合您今天要解决的问题。