错误的处理是一个服务必不可缺的环节。经过一些实践和积累,对错误处理进行阶段性的总结。
在平时的业务开发中,我们可以认为http状态码不为2xx系列的,都可以认为是请求错误, 并伴随响应的错误信息。常用做法都是通过 code、message 两个字段来进行业务处理结果描述,并且希望能够以json响应体来进行响应。
正确统一返回http状态码为200
预定义错误(业务性错误)统一返回http状态码为400
其他(主要是500)为预期之外的异常。
结构体中,正确为统一一套结构体(业务返回)。
预定义错误和未定义错误为
{
"code":10001,
"message":"用户未找到"
}
或者
{
"reason":"USER_NOT_FOUND",
"message":"用户未找到"
}
使用code在约定上会规范一些,更好统计。使用reason会更清晰一些,见名知意。
数据校验不通过。有的开发者认为,只要是预期内的错误,比如参数错误,都是可以用200返回的,然后在内部用isfailed来进行判断。
我反对: http状态码是状态码,而不是错误码,是可以完全利用起来的。业务正确错误一把梭,这里httpcode还有什么作用呢?keep it simple。
目前国内的大小厂、第三方,都是统一返回200的,或许是出于一些业务考虑,可行,但并不一定最优。
https://appleid.apple.com/auth/token
http 400
{
"error": "invalid_client"
}
https://graph.facebook.com/v2.9/me?fields=id%2Cname%2Cpicture%2C%20picture&
http 400
{
"error": {
"message": "An active access token must be used to query information about the current user.",
"type": "OAuthException",
"code": 2500,
"fbtrace_id": "A02VYHGCkrFVSmECEpFKmfq"
}
}
https://api.twitter.com/1.1/statuses/mentions_timeline.json
http 400
{
"errors": [
{
"code": 215,
"message": "Bad Authentication data."
}
]
}
https://api.weixin.qq.com/sns/jscode2session?appid=a4d4568079&secret=cb9eae93d063961050bf1a319a&js_code=041Kog0w3XC5EWa3w34Brpi3Kog0b&grant_type=authorization_code
http 200
{
"errcode": 40029,
"errmsg": "invalid code, rid: 63245661-33bd370a-2f5d2f67"
}
https://open.youzanyun.com/auth/token
http 200
{
"success": false,
"code": 1103,
"data": null,
"message": "未授权或者已经取消授权"
}
https://spapi.baidu.com/oauth/jscode2sessionkey
http 200
{
"errno": 1104,
"error": "invalid code , expired or revoked",
"error_description": "invalid code , expired or revoked"
}
最简洁的是苹果的,只有一个error字段去描述错误信息。
欢迎留言讨论