2015-10-31 64 views
3

我正在开发一个JAX-RS API,它包含一个带有“id”和“name”字段的简单“Person”表,其中“id”绑定到mysql数据库中的自动编号。一个典型的用例是发布一个新的人。REST POST提供ID时该怎么办?

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

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

  • 拒绝为无效请求
  • 从请求删除ID,并继续处理
  • 对待POST像UPSERT(上更新失败,删除ID和插入)
  • 尝试使用提供的ID

的最后一个选项来创建新的记录,似乎从安全角度狡猾。如果我使用mysql,恶意用户可以在一个请求中将我的自动编号上升到最大值。

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

+0

选项#1或选项#2。选项#2可能会更方便,但如果有人稍后用某个ID发送某些内容并且不理解您为什么不使用它,可能会引起混淆。 – Bill

+0

我赞成拒绝。如果用户发送无效请求,您永远无法确定实际的意图是什么或者错误的确切性质。 –

+0

拒绝它。 400错误请求。服务器创建的标识符的全部重点是......呃,服务器来创建它。这是POST的一般性质。允许客户干预这一过程,可能会产生不良后果。由于比尔提到的原因,我也远离2,而PM暗示。发送400错误信息 –

回答

0

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

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

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

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

0

另一个选择是只用@JSonIgnore注释忽略它。在GET,PUT或DELETE中,您将拥有/ user/{id},所以客户端应该已经知道该ID。在一个POST上,客户端不应该发送一个ID,你应该返回这个ID,或者说,你可以得到一个URL,你可以获得创建的对象,其中包括ID。

+0

这相当于第二个选项。 – phatfingers