客户端提供与服务器为 api 服务生成的 ID
Client supplied vs Server Generated ids for api services
我有一项服务 "job",可通过 API 访问。用户可以 POST 到端点,作业将开始。一段时间后,作业的结果将 post 返回到提供的 webhook。
在这种情况下处理ID主要有两种方式:
服务器端 - 在作业开始时,一个 id 被传回给创建者。创建者持有该 ID,稍后当作业完成时,他们将获得带有该 ID 的输出并能够连接这些点。
客户端 - 客户端随作业提交一个 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 设置
无论哪种方式,最好 return 已创建项目的 ID。完成此操作后,您可以更进一步,允许客户端明确不包括 id。当看到该显式触发器时,您可以为它们创建 id 并像往常一样 return 它。
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 系统)。
我有一项服务 "job",可通过 API 访问。用户可以 POST 到端点,作业将开始。一段时间后,作业的结果将 post 返回到提供的 webhook。
在这种情况下处理ID主要有两种方式:
服务器端 - 在作业开始时,一个 id 被传回给创建者。创建者持有该 ID,稍后当作业完成时,他们将获得带有该 ID 的输出并能够连接这些点。
客户端 - 客户端随作业提交一个 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 设置
无论哪种方式,最好 return 已创建项目的 ID。完成此操作后,您可以更进一步,允许客户端明确不包括 id。当看到该显式触发器时,您可以为它们创建 id 并像往常一样 return 它。
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 系统)。