问题描述
我们在处理服务器返回的数据时候,经常碰到两种类型的返回数据,如下:
// 格式一
{
"response": {
"name": "xx",
"age": "23"
}
}
// 格式二
{
"code": "404",
"message": "error url",
"response": {
"name": "xx",
"age": "12"
}
其中,
- 格式一(1)需要前后台统一通过HTTP标准协议,判断可能出现的请求错误;
- 格式二(2)由后台定义请求过程中出现的请求错误;
分析
格式一(1)虽然使用了HTTP标准协议,但是涉及到具体的业务错误,比如用户名密码错误、请求参数错误等问题,我们就无法确认到底是网络的原因、服务器的原因或者用户请求参数的原因;所以客户端关心的除了网络错误,更多的是业务错误,服务器返回的错误必须一对一的,不能一个错误码代表多种错误场景。
例如,下面登录场景:
protected HttpCallBack mHttpCallBack = new HttpCallBack() {
@Override
public void onFailure(Exception e) {
hideLoadingProgress();
if (null != e) {
CommonMethod.showToast("请检测网络设置");
} else {
CommonMethod.showToast("登录失败");
}
}
@Override
public void onResponse(int code, String resultStr) throws IOException {
hideLoadingProgress();
if (code == 200 && !TextUtils.isEmpty(resultStr)) {
try {
int flag = Global.parsePassPort(resultStr);
if (flag == 1) {
Global.userInfo.setPwd(mPwd);
finish();
RootActivity.launch(LoginActivity.this);
return;
} else if (flag == -1) {
CommonMethod.showToast("登录失败 手机时间设置错误");
return;
} else if (flag == 0) {
//当只是密码输入错误时候,返回的状态码依然是200,但是resultStr解析的flog,却是0。
CommonMethod.showToast("登录失败 账号或密码错误");
return;
}
} catch (Exception e){
e.printStackTrace();
CommonMethod.showToast("登录失败");
}
CommonMethod.showToast("登录失败");
}
}
};
/**
服务器返回数据类型:
{
"result_status": 1,
"result_desc": "成功",
"columns": [
{
"column_name": "客户编号",
"column_key": "id",
"column_type": 0,
"default_value": ""
},
{
"column_name": "客户姓名",
"column_key": "client_name",
"column_type": 1,
"default_value": ""
},
{
"column_name": "公司名称",
"column_key": "client_company",
"column_type": "3",
"default_value": ""
}
],
"columns_ver": "1"
}
*/
番外
在格式一中,我考虑有一种场景是, 按照标准的HTTP协议,我们说401是未授权(登录过期),有没有这样情况,由于网络错误,或者后台处理有问题,也会导致报401错误?现在想想,其实没有必要考虑这个问题,如果按照格式一,后台返回401,指定是出了问题,如果前端在保证传参正确的情况,也只能和后台进行联调了.
网友评论