您如何看待使用UUID v5使REST APIPOST等幂?

问题描述

如果请求失败,则HTTP POST通常不是幂等的(再次执行失败的请求可能会导致多次插入)。您如何将用户会话ID用作UUID v5“名称空间”,而将JSON有效负载用作“名称”呢?它将为多个请求产生相同的ID,并且数据库将拒绝其他插入。

解决方法

有些API专门将HTTP方法标记为非幂等。

默认情况下,POST是非等幂的,并不表示不允许这样做,这只是意味着通用客户端无法假定它们是。

我见过的最好的实现是Stripe API,它使用Idempotency-Key作为HTTP标头。客户端对此进行定义,如果接收到两个具有相同ID的请求,则Stripe知道如何处理第二个请求。我认为这是最好的方法,并且比尝试根据请求构造哈希的想法更好。 外观请求相同并不意味着效果相同,请考虑以下POST请求:

POST /increment
Content-Type: application/json

{ "increment-by": 2 }

如果我两次发送此请求,那么即使每次请求的正文都相同,我也希望ID会增加到4。

Idempotency-Key允许客户端控制并通知服务器2个请求实际上是否相同。

https://stripe.com/blog/idempotency

后续行动:

我是否将幂等键存储为记录中的单独列?

我倾向于将这种功能作为某种中间件在全球范围内实现。

将等幂密钥存储在Redis之类的文件中会产生两个现实的风险(例如,服务器创建数据库记录并在写入Redis之前崩溃)。

使用交易。

您需要存储的所有密钥都是您之前看过的,并且只有在请求成功后才需要存储。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...