RESTful答题API中修改已提交的不可变答案时应返回的HTTP错误码咨询
针对你这个答题系统的场景,我来逐个拆解你提到的错误码,帮你选出最贴合REST规范的选项:
1. 405 Method Not Allowed:这其实是最合理的选择
你担心“允许方法列表随时间变化”是否合理——完全没问题!RESTful API中,资源的可用方法本来就会随着它的状态动态变化。比如一个未创建的资源可能支持POST/PUT,创建完成后就只支持GET(或者像你这里的场景)。
当客户端在答案提交后再发PUT请求,返回405的同时,一定要在响应头里加上Allow: GET,明确告诉客户端当前这个资源支持的合法方法。这样客户端就能清楚知道自己用错了方法,而不是犯了其他类型的错误。
2. 409 Conflict:不适用
你提到的RFC描述很准确——409是给用户可以通过调整请求解决冲突的场景准备的,比如并发修改同一个资源导致版本冲突,用户可以拿最新版本重新提交。但你的场景里,答案提交后就是不可变的,客户端没有任何办法解决这个“冲突”,所以409完全不符合语义。
3. 400 Bad Request:太宽泛,容易误导
400的核心是请求格式/语法错误,比如JSON格式写错、参数类型不匹配这种。而你的场景是客户端的请求语义错误(试图修改一个不可修改的资源),不是格式问题。用400的话,客户端开发人员可能会误以为自己的请求体格式有问题,反而找不到真正的原因。
4. 5xx类错误:绝对不能用
5xx是服务器端的意外错误,比如数据库挂了、代码抛异常,但你的场景是完全符合业务预期的逻辑——答案提交后就是不能改,这根本不是“意外情况”。用5xx会严重误导客户端,让他们以为是服务器出问题了,而不是自己的操作不符合规则。
总结
直接返回405 Method Not Allowed,同时带上Allow: GET响应头,这是最符合REST规范、语义最清晰的选择。
内容的提问来源于stack exchange,提问作者leo

