背景:
在前后端接口设计上,一般会有一个状态码,表示成功或者失败。
但是一个请求会有两个状态,一个是通讯层面的,200,500,400,404等。一个是业务层面的,自己定义的。在某些场景下可能会混淆。比如请求成功了,但是业务失败了,这个时候对应的code返回什么呢?
看一下大厂的
微信的支付接口如下:
1、分为了两个码,一个是通讯的码,一个是业务的码。
2、通讯码相当于boolean值,只存成功或者失败,没有详细的分成不同编码,详细信息里显示信息。通讯成功后,再看里面业务的码是成功还是失败,失败的码才有分类,分成不同的码和对应的描述
3、没有管通讯状态404,估计因为是外部接口,而不是前后端接口
总结:微信的就是两层,两个字段来判断是否成功,先判断通讯是true还是false,true继续看业务编码是true还是false。
所以在调用微信支付接口时,需要判断两次,
来看支付宝的:
1、也是两个码,一个code是网关返回码,一个是业务返回码。都有具体的代码,而不是类似布尔类型。
2、可以理解为 业务成功就是code 是成功的码,判断一个就行,其他的不是业务的错误因为接口对接碰到的比较多,所以放在了和code同级的(所有接口都是相同的公共错误)。业务错误因为接口太多了,所以写一个大的业务错误而不是把所以的业务错误编码都放到和code同级。
3、也是没有处理404的情况。
总结:支付宝的实际是一层,一个字段判断是否成功的编码,如果不是,看看是接口公共错误,还是业务错误,如果是业务错误需要进到下一级的业务编码里去找
选择自己的才是合适的,个人总结了下。
1、因为是前后端分离,肯定是前端判断一个编码来区分是否成功比较好。一个code,成功代表100000, 就表示业务成功了。(通讯成功+业务成功)
2、其他业务错误编码看业务多少,如果业务少,就直接放到和code同一级。如果业务很多,可以再加一个sub_code区分细节。(对应自己定义的异常类)
3、因为是前后端分离,所以考虑404等错误,也后端捕获,统一返回json数据(http的通讯状态还是保持不变)。code用通讯码。-----这一条不考虑也行,反正spring boot 默认会跳到一个错误页面。----追加思考,404这种想返回json的处理,和这个错误码不妨到一起,单独搞一个枚举类去处理。混在一起容易乱。
总结:使用1个code,其中一个码表示成功,其他码表示失败(3类:【对应通讯异常类,主要是用来404等错误转json用】【自定义编码对应业务(例如:用户名不能为空)和自定义异常(例如:数据库访问异常、业务层访问异常)进行编多个码,如果业务多,可以再细分一层,或者把业务和非业务的异常再区分一个类型】【系统异常:代码错误导致或者其他未知异常(在支付宝中对应服务不可用)】)
SUCCESS(10000, "操作成功"),//前端只需要判断是否等于10000,就可以表示是否成功了。(通讯成功加业务成功) /** * 通讯的返回码--对应通讯异常,业务自定义异常不要用这个 */ //SUCCESS(200, "操作成功"),//防止前端误解,用10000表示最终成功(包括通讯成功加业务成功),其他就都是错误码(通讯的错误码和业务的错误码) //REDIRECT(302, "重定向"),//用不到 PARAM_ERROR(400, "请求参数错误"), UNAUTHORIZED(401, "没有权限"), FORBIDDEN(403, "禁止访问"), NOT_FOUND(404, "资源不存在"), NOT_SUPPORTED(405, "Method Not SUPPORTED"), //SERVER_ERROR(500, "系统异常"),//为防止通讯错误码和业务错误码混淆,不用500,用对应的业务错误码。 ROUTER(700, "路由"), /** * 业务级错误码 对应bussion-exception,自定义的异常 */ //110000到119999 为登录模块的异常 WEB_ERROR(110000, "用户名和密码出错"), SERVICE_ERROR(120000, "没有授权"), DB_ERROR(191000, "数据库访问异常"), IO_ERROR(192000, "IO操作异常"), OTHER_ERROR(900000, "其它错误"),//业务的错误 /** * 未知的系统错误 对应Exception 异常 ,可能是代码错误或者其他未知的异常 */ SYS_ERROR(999999,"系统异常");
后面的纠结:(后面有在想后端要不要处理接口的404?如何处理?看腾讯的某个接口,要么就是返回json不支持,要么就是返回404,可能页面的前端控制到404页面,接口的就对应的接口数据吧。不管了,反正这么做没错。就这样了。)
后面又想了想,可能不太对,因为我看的大厂的是外部对接接口,不是前后端分离接口。找了一下,截图
微信的:也是一个字段,使用errorcode,成功的时候就是0,错误的时候是其他码。
支付宝
在前后端这一块反而是和接口那块反过来了,用一个boolean字段 success,来判断,但是他这个success不知道是不是业务的success,还是只是通讯的success,另外他加了traceid。
看data里面还有errorCode,推测可能还是用一个字段。如果失败了,再看data里面的errorCode,为啥不直接用一个code,要搞的2个字段呢?可能是业务太多,一个code搞不过来,所以搞两层?不管了,按自己意思来了。就一个code。