REST POST提供ID时该怎么办?

pha*_*ers 6 rest jax-rs autonumber

我正在开发一个JAX-RS API,其中包括带有字段“ id”和“ name”的简单“ Person”表,其中“ id”绑定到mysql数据库中的自动编号。一个典型的用例是发布一个新人。

JSON消息的POST {"name":"Bob"}可能会返回,例如{"id":101,"name":"Bob"}

如果调用方请求对包含标识符的对象进行POST,该怎么办?看来我的选择是:

  • 拒绝该请求为无效
  • 从请求中删除ID,然后继续处理
  • 将POST视为UPSERT(在更新失败时,删除ID并插入)
  • 尝试使用提供的ID创建新记录

从安全的角度来看,最后一个选项似乎很狡猾。如果我使用的是mysql,则恶意用户可能会在一个请求中将我的自动编号提高到最大值。

如何在REST API中处理在POST请求中包含ID的问题?

Opa*_*pal 5

您绝对应该拒绝所有到达/users/端点的请求。首先,出于安全原因(在数据库级别),其次这不是客户端生成/建议 ID 的工作。

因此,答案是将请求作为无效的请求连同适当的状态代码 ( 400) 和解释拒绝原因的消息一起拒绝。

第二个选项是不直观的,即发送和 ID(正如我所写的那样已经是一个坏主意)- 不希望收到它发布的不同 ID。在正文中发送 ID,对于PUT请求是有意义的,并且它假定对象已经创建/存在 - 这是一个更新。

第三个选项不是 RESTful - REST 中没有 upsert -POST创建新资源。第四个选项根本没有意义 - 这不是客户提供 ID 的工作。

  • 我相信根据 https://tools.ietf.org/html/rfc7231#section-4.3.4,“UPSERT”语句可以很好地映射到“PUT”方法 (3认同)