【发布时间】:2014-02-24 08:42:54
【问题描述】:
我们正在构建公共 RESTful JSON API,并试图找出在指定属性不存在时 POST/PUT 请求的最佳做法。我们应该抛出一个 HTTP 错误,还是直接跳过它并应用所有其他属性?
{
"name" : "Test",
"property_doesnt_exist" : "that's sad"
}
【问题讨论】:
我们正在构建公共 RESTful JSON API,并试图找出在指定属性不存在时 POST/PUT 请求的最佳做法。我们应该抛出一个 HTTP 错误,还是直接跳过它并应用所有其他属性?
{
"name" : "Test",
"property_doesnt_exist" : "that's sad"
}
【问题讨论】:
服务器的一个共同规则是在接受的内容上大方,在制作的内容上严格。
我更愿意接受这样的意见,并尽可能多地从中受益。输入的任何未知属性都将被忽略。
【讨论】:
HTTP 422:无法处理的实体
422(Unprocessable Entity)状态码意味着服务器理解请求实体的内容类型(因此 415(Unsupported Media Type)状态码是不合适的),并且请求实体的语法是正确的(因此 400 (错误请求)状态代码不合适)但无法处理包含的指令。例如,如果 XML 请求正文包含格式正确(即语法正确)但语义错误的 XML 指令,则可能会发生这种错误情况。 RFC4918
如果消息还包含无效属性,通常的做法是不添加有效的消息属性。
【讨论】:
在回答这个问题时,您还必须考虑版本控制。您是否支持发送比预期更少的参数的旧客户端 - 可以使用合适的默认值。或者您是否有多个服务器实现,以至于较新的客户端会为较旧的服务器实现发送太多参数?如果其中之一的答案是肯定的,那么您必须小心拒绝输入。
【讨论】: