为了它的价值,我以不同的方式做这件事。成功的调用只有 JSON 对象。我不需要包含指示 true 的成功字段和具有 JSON 对象的有效负载字段的更高级别的 JSON 对象。对于标头中的 HTTP 状态,我只返回 200 或 200 范围内适当的 JSON 对象。
但是,如果出现错误(400 系列中的某个错误),我会返回一个格式正确的 JSON 错误对象。例如,如果客户端正在使用电子邮件地址和电话号码发布用户,并且其中一个格式错误(即我无法将其插入到我的基础数据库中),我将返回如下内容:
{
"description" : "Validation Failed"
"errors" : [ {
"field" : "phoneNumber",
"message" : "Invalid phone number."
} ],
}
这里的重要一点是“字段”属性必须与无法验证的 JSON 字段完全匹配。这使客户可以确切地知道他们的请求出了什么问题。此外,“消息”位于请求的语言环境中。如果“emailAddress”和“phoneNumber”都无效,则“errors”数组将包含两者的条目。409(冲突)JSON 响应正文可能如下所示:
{
"description" : "Already Exists"
"errors" : [ {
"field" : "phoneNumber",
"message" : "Phone number already exists for another user."
} ],
}
有了 HTTP 状态代码和这个 JSON,客户端就拥有了以确定性方式响应错误所需的一切,并且它不会创建一个新的错误标准来尝试完全替换 HTTP 状态代码。请注意,这些仅发生在 400 个错误的范围内。对于 200 范围内的任何内容,我都可以返回合适的内容。对我来说,它通常是一个类似 HAL 的 JSON 对象,但这并不重要。
我想添加的一件事是“错误”数组条目或 JSON 对象本身的根中的数字错误代码。但到目前为止,我们还不需要它。