【发布时间】:2015-10-31 14:36:51
【问题描述】:
我正在开发一个 JAX-RS API,其中包含一个简单的“Person”表,其中包含“id”和“name”字段,其中“id”与 mysql 数据库中的自动编号相关联。一个典型的用例是发布一个新人。
JSON 消息 {"name":"Bob"} 的 POST 可能会返回,例如,{"id":101,"name":"Bob"}。
如果调用者请求包含标识符的对象的 POST 怎么办?看来我的选择是:
- 拒绝无效请求
- 从请求中删除id并继续处理
- 将 POST 视为 UPSERT(更新失败时,删除 ID 并插入)
- 尝试使用提供的 ID 创建新记录
从安全角度来看,最后一个选项似乎很狡猾。如果我使用 mysql,恶意用户可能会在一次请求中将我的自动编号提升到最大值。
应该如何在 REST API 中处理 POST 请求中包含的 id?
【问题讨论】:
-
选项 #1 或选项 #2。选项 #2 可能更方便,但如果有人稍后发布带有 id 的内容,然后不明白您为什么不使用它,则可能会造成混淆。
-
我赞成拒绝。如果用户发送无效请求,您永远无法确定其实际意图或错误的确切性质。
-
拒绝它。 400 错误请求。服务器创建的标识符的全部意义在于......好吧,创建它的服务器。这是 POST 的一般性质。允许客户干预此过程可能会产生不良后果。由于比尔提到的原因,我也远离 2,并且 PM 暗示。发送带有错误消息的 400
-
是的,拒绝 ID 似乎是要走的路。我还有只读的创建和更新日期字段,如果提供,我更倾向于忽略而不是拒绝。
标签: rest jax-rs autonumber