【发布时间】:2017-10-06 16:07:43
【问题描述】:
如果我的应用程序有不止一种方法来识别资源,例如全局唯一标识符,以及更人性化的值的复合键,这被认为是可取的?
举个例子:
- https://localhost:12345/api/customer/{customerId:int}/product/{productSku}
- https://localhost:12345/api/customer/732/product/46
- https://localhost:12345/api/customer/abc-spares-ltd/product/CF31-APB
相对于:
这是一种可能,但似乎毫无意义:
- https://localhost:12345/api/customer/{customerId:int}/product/{productGlobalId:Guid}
- https://localhost:12345/api/customer/81C51258-DDDD-4815-A207-37ED735D1AEA/product/B51B6E8A-B68E-4FD0-9FC2-BAA682FAFB14
除了在这种情况下可读性较差(更直接的可能很容易成为系统中的唯一整数),选择背后的原因是什么?应该两者都实现,还是给定资源只有一个 URL?
我认为有一些影响:
- 第二个选项将需要较少的“友好”ID 值和内部全局唯一值之间的转换。
- 在 SQL 数据库中,使用主键意味着不必定义更多索引(这会影响插入/更新)。
- 在 NoSQL 数据库中,“get-by-ID”是典型的,如果不使用数据库系统的“主键”等效项,或者可能需要进行一些转换,查询甚至可能返回最终一致的数据。
- 两者之间是否存在关系(在本例中存在关系,但由于存在 guid ID,因此不一定非要将产品作为集合的子集来查找。
- DDD 风格的聚合设计是否会影响决策?例如,产品不会成为客户聚合的一部分,即使实际上存在关系(例如,一个客户不会“看到”另一个客户的产品)。
- 如果理论上可以修改产品的“SKU”,那么 URL 实际上最终可能指向不同的资源。使用不可变的“内部”标识符这是不可能的(您可能会通过软删除实现 404,并创建一个全新的产品)。
【问题讨论】:
-
不知道为什么 API 端点应该是人性化的,因为它是一个编程接口,所以我最好坚持
/customer/732/product/46。跨度>
标签: web-services rest http url