REST POST提供ID时该怎么办?

时间:2015-10-31 14:36:51

标签: rest jax-rs autonumber

我正在开发一个JAX-RS API,其中包含一个简单的“Person”表,其中包含字段“id”和“name”,其中“id”与mysql数据库中的自动编号相关联。一个典型的用例是POST一个新人。

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

如果调用者请求包含标识符的对象的POST,该怎么办?我的选择似乎是:

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

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

如何在REST API中处理在POST请求中包含id?

2 个答案:

答案 0 :(得分:2)

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

所以答案是拒绝请求作为无效请求以及适当的状态代码(400)和解释拒绝原因的消息。

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

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

答案 1 :(得分:0)

另一个选择是使用@JSonIgnore注释忽略它。在GET,PUT或DELETE你有/ user / {id},所以客户端应该知道ID。在POST上,客户端不应该发送ID,您应该返回ID,或者更确切地说,是一个可以获取创建对象的URL,其中包含ID。