客户端提供的 vs 服务器生成的 API 服务的 ID



我有一个通过API访问的服务"作业"。 用户可以 POST 到端点,作业将启动。 一段时间后,作业的结果将回发到提供的 Webhook。

在此方案中,有两种主要处理 ID 的方法:

  1. 服务器端 - 在作业启动时,ID 将传递回创建者。 创建者保留该 id,稍后当作业完成时,他们将传递带有 id 的输出并能够连接点。

  2. 客户端 - 客户端随作业提交 ID。 服务器确保此 ID 是唯一的,然后在作业完成后将其传回。


这是我找到的唯一一篇关于这个主题的文章(https://www.techyourchance.com/client-generated-ids-vs-server-generated-ids/(


老实说,我无法分辨这两个人的正面或反面。 我的直觉告诉我,客户端将不太容易出现用户错误(ID错位(。 是否有任何有据可查的应用程序在两者之间有所不同?

为什么不两者兼而有之?

我最终选择了一条似乎都能充分利用这两种行为的路线。 允许用户提交 ID,然后在内部强制实施唯一性。 或者,允许他们提交缺少的 ID,并为其生成一个。


客户端 ID 设置

这里最大的风险是提交预先使用ID(可能被其他人使用(的客户。 目前,我强制避免此问题的方法是要求所有提交的 id 以客户端的 id 开头(例如。client#123_client-generated-id#4(。 这样,任何冲突都会发生在它们身上,并且可用于避免多次创建项目。


服务器端 ID 设置

无论哪种方式,最好返回已创建项的 ID。 完成此操作后,您可以通过允许客户端明确不包含 id来更进一步。 当看到该显式触发器时,您可以为它们创建 id 并照常返回它。

POST@user/comments -> {
id: null | "NO_ID" | "VOID" | "Special value specified in the docs"
userId: "client#123"
msg: "k"
} -> {
id: "client#123_server-generated-id#5"
}

通过同时执行这两个操作,您应该拥有一个对高级用户幂等的系统(例如,他们不会意外地创建两次相同的内容(,并且对于临时用户来说很容易(他们不必管理 id 系统(。

最新更新