Restful API - JSON 响应有一个或所有错误
Restful API - JSON response with single or all error(s)
我当前的项目 restful API 验证 POST 创建新用户的请求,并且可能会发生多个错误(HTTP 状态):
- 未设置用户名 (400 BadRequest)
- 用户名被占用(409冲突)
- 服务器无法建立数据库连接(500 内部服务器错误)
- ...
我是否应该像这样立即发回 JSON 回复
{
"status": 400,
"Message": "No username is set"
}
如果检测到错误,或者如果我像这里这样累积所有错误应该更好:
{
"status": <HTTP STATUS CODE>,
"errors": [
{"message": "Username is not set."},
{"message": "Can't access the database."}
]
}
最后一种方法不需要多个请求来发送有效负载。但是,如果未设置用户名(400 Bad Request)或服务器无法访问数据库(500 Internal Server Error),应该使用哪个状态码?
我认为如果您预见到一个请求中需要多个错误,那么第二个 JSON(有多个错误)是首选。进行多重错误响应的另一个好处是,作为您服务的用户,如果我返回多个错误,我可以一次解决所有错误,而不是在我得到它们时一次解决它们。
经过一些研究,最好(最标准)的响应方式是 JSON 这种形式的结构:
{
"error": {
"code": "400",
"message": "main error message here",
"target": "approx what the error came from",
"details": [
{
"code": "23-098a",
"message": "Disk drive has frozen up again. It needs to be replaced",
"target": "not sure what the target is"
}
],
"innererror": {
"trace": [ ... ],
"context": [ ... ]
}
}
}
您要放置的多个错误将是“详细信息”数组中的单个元素。使用此结构,您仍然需要一些错误的总体摘要,但是详细信息将包含您想要的尽可能多的单个错误消息。
这是 OASIS 数据标准 OASIS OData 提出的格式,似乎是目前最标准的选项,但目前似乎没有任何标准采用率很高。
这也符合 JSON RPC 2.0 Spec,因为它要求错误是“错误”成员中的一个对象,并且您有代码和消息。
您可以在以下位置找到实现此功能的完整开源库:Mendocino JSON Utilities。该库支持 JSON 对象以及异常。
详细信息在我的博客 post Error Handling in JSON REST API
中讨论
我当前的项目 restful API 验证 POST 创建新用户的请求,并且可能会发生多个错误(HTTP 状态):
- 未设置用户名 (400 BadRequest)
- 用户名被占用(409冲突)
- 服务器无法建立数据库连接(500 内部服务器错误)
- ...
我是否应该像这样立即发回 JSON 回复
{
"status": 400,
"Message": "No username is set"
}
如果检测到错误,或者如果我像这里这样累积所有错误应该更好:
{
"status": <HTTP STATUS CODE>,
"errors": [
{"message": "Username is not set."},
{"message": "Can't access the database."}
]
}
最后一种方法不需要多个请求来发送有效负载。但是,如果未设置用户名(400 Bad Request)或服务器无法访问数据库(500 Internal Server Error),应该使用哪个状态码?
我认为如果您预见到一个请求中需要多个错误,那么第二个 JSON(有多个错误)是首选。进行多重错误响应的另一个好处是,作为您服务的用户,如果我返回多个错误,我可以一次解决所有错误,而不是在我得到它们时一次解决它们。
经过一些研究,最好(最标准)的响应方式是 JSON 这种形式的结构:
{
"error": {
"code": "400",
"message": "main error message here",
"target": "approx what the error came from",
"details": [
{
"code": "23-098a",
"message": "Disk drive has frozen up again. It needs to be replaced",
"target": "not sure what the target is"
}
],
"innererror": {
"trace": [ ... ],
"context": [ ... ]
}
}
}
您要放置的多个错误将是“详细信息”数组中的单个元素。使用此结构,您仍然需要一些错误的总体摘要,但是详细信息将包含您想要的尽可能多的单个错误消息。
这是 OASIS 数据标准 OASIS OData 提出的格式,似乎是目前最标准的选项,但目前似乎没有任何标准采用率很高。
这也符合 JSON RPC 2.0 Spec,因为它要求错误是“错误”成员中的一个对象,并且您有代码和消息。
您可以在以下位置找到实现此功能的完整开源库:Mendocino JSON Utilities。该库支持 JSON 对象以及异常。
详细信息在我的博客 post Error Handling in JSON REST API
中讨论