URL含数据库自动生成UUID且资源不存在时,PUT方法的RESTful正确行为?
处理PUT请求中不存在的自动生成UUID资源的RESTful方案
你的场景很明确:CRUD应用的书籍资源ID由数据库插入时自动生成UUID,当客户端发起PUT http://host/books/{数据库生成的UUID}请求,且路径中的UUID对应资源不存在时,正确的RESTful处理方式是返回404 Not Found状态码。
为什么选404?
404的语义就是“服务器无法找到请求的目标资源”,完全匹配当前场景——客户端请求的那个UUID对应的书籍根本不存在,服务器没有办法完成更新操作,用404告知客户端最直接准确。
为什么不选其他状态码?
- 400 Bad Request:这个状态码用于请求本身存在问题的情况,比如请求格式错误、参数非法等,但这里客户端的请求格式和参数都是合法的,只是目标资源不存在,所以不适用。
- 422 Unprocessable Entity:这个状态码针对的是请求语法正确,但语义上无法处理的情况(比如提交的书籍数据包含不符合业务规则的字段),和资源不存在的问题不相关,也不合适。
额外说明
如果客户端想要创建新的书籍资源,应该引导它使用POST请求发送到/books端点——这才是REST规范中用于创建新资源的正确方式,服务器会由数据库生成UUID,并返回新资源的URI给客户端。
内容的提问来源于stack exchange,提问作者Wieland Gmeiner
相关产品推荐
相关产品推荐

