我正在开发一个JAX-RS API,其中包含一个简单的“Person”表,其中包含字段“id”和“name”,其中“id”与mysql数据库中的自动编号相关联。一个典型的用例是POST一个新人。
JSON消息{"name":"Bob"}
的POST可能会返回,例如{"id":101,"name":"Bob"}
。
如果调用者请求包含标识符的对象的POST,该怎么办?我的选择似乎是:
从安全角度来看,最后一个选项似乎很狡猾。如果我使用的是mysql,恶意用户可以在一次请求中将自动编号提升到最大值。
如何在REST API中处理在POST请求中包含id?
答案 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。