一般对于接口返回状态码表示不同的结果,比如登陆,有些人会写很多个状态码,如:101,102,103,而有些人只写一个,如:status为0或者1,具体例子:
只用status一个状态码:
// 只要登陆成功,status为1,否则都为0,具体信息放在msg里面
// 成功
{
status: 1,
msg: '登陆成功'
}
// 用户名不存在
{
status: 0,
msg: '用户名不存在'
}
// 密码错误
{
status: 0,
msg: '密码错误'
}
用多个状态码的情况可能如下:
// 成功
{
code: 200,
msg: '登陆成功'
}
// 用户名不存在
{
code: 201,
msg: '用户名不存在'
}
// 密码错误
{
code: 202,
msg: '密码错误'
}
显然第二种会更麻烦,虽然更具体。大家一般都会第二种的吧,第一种的话,会有什么不合适的地方的呢?想看看大家的想法
我的设计方案是:
说明:
code
:状态码,使用字符串failure_password_or_account_error
,这种具有自说明性的状态码,并且不容易重复success
。其他状态码全局唯一但是各个接口可能会出现相同状态码。do_something_1
、do_something2
等。login_status_timeout
,登录过期......summary
:说明,是对状态码的说明,一般是中文,failure_password_or_account_error
,前端不需要捕捉这个错误,而直接提示summary
,此时sumamry
的内容是账户或者密码错误
,这样前端就不需要捕捉每个状态码,只需要捕捉特定的的就好了。error_yo_yo:异地登录,请重新登录
,这时候前端暂时不捕捉也没事,毕竟默认就把summary
提示出来了,所以用户就会看到异地登录,请重新登录
的提示,虽然跳到登录页面更好,但是暂时也不影响用户操作。data
:这是真正的数据,需要的时候就返回key
:对data
的加密,用来校验参数是否被篡改timestamp
:时间戳,可用来加密data
入参,同时给后端校验nonce
:无意义随机字符串,配合timestamp
防重放攻击说明:
上面的流程直接封装成网络层,配合模型层,上层的业务几乎感觉不到这里的繁杂的东西,对上层来说,该捕捉状态码的时候,直接捕捉,不需要捕捉的时候,甚至都不用理会。将
细节屏蔽
、扩展能力扩大
才是最优的使用经验:
这一套使用了大概2年,也经过好几次改版和迭代,横跨了十多个项目,涉及
原生安卓
、ios
、js
等,虽然上面有很多细节没有说的很清晰,但是也差不多了。