Taro跨端开发探索6——响应码处理与响应体优化

535 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

前言

昨天因为时间原因,没有处理res.data的返回多层问题。我们现在后端返回的数据格式为固定的格式,今天我们优化一些resolver res.data问题

step1 优化返回体的data取值

我们现在的后端返回的数据格式如下

private int code;
private String msg;
private T data;
private boolean success;

其中:

  • code对应响应码,一般200代表响应成功,500代表服务器异常,401代表资源需要权限,403代表权限验证未通过再加上一些后端自定义的code组成我们的响应码,我们这篇文章以响应码来处理对应的业务弹窗
  • msg对应响应信息,一般用来提示较多
  • data对应获取到的数据
  • success对应是否成功的标识 我们首先优化一下昨天的昨天res.data多层嵌套才能获取最终data的问题,我们修改request.tsx里的request方法如下
function request(url, data, method): Promise<any> {
  return new Promise((resolve, reject) => {
    Taro.request({
      url,
      data,
      method,
      header: {
        "content-type": "application/json"
      }
    }).then(res => {
      if (res.statusCode === 200) {
        resolve(res.data);
      } else {
        reject(res);
      }
    });
  });
}

step2处理后端的响应码

我们这里先拉取一下对应的后端api代码:gitee.com/liangminghu…
之后我们只启动april-article-day-10\

原生异常捕获

这时我们先切换至小程序首页,处理taro原生request的异常信息
在控制台中显示的提示如下

1649773256(1).png 我们可以看到,对应的提示是作为异常抛出的,我们补充一下,在request的then()处理结束后,添加catch捕获异常
代码如下

function request(url, data, method): Promise<any> {
  return new Promise((resolve) => {
    Taro.request({
      url,
      data,
      method,
      header: {
        "content-type": "application/json"
      }
    }).then(res => {
      console.log(res);
      if (res.statusCode === 200) {
        resolve(res.data);
      } 
    }).catch(err=>{
      Taro.showToast({"title": "网络错误,提示:"+err.errMsg,"icon": "none"});
    });
  });
}

后端异常捕获

我们在user的api入口添加几个4010后端服务不存在的uri,在user/index.tsx进行调用
定义api

export const test404 = (code) =>
  post(`${homeReqUrl}/auth/login/aaaBBBccc?code=${code}`, null);

在user/index.tsx头部引入接口然后将调用就放在useEffect入口处就行了
特别说明,下面这个步骤按照自己的需要来处理
我们在访问不存在(404)的路径时,控制台的输出如下

1649773860(1).png 我们在statusCode不等于200时添加判断代码后如下

function request(url, data, method): Promise<any> {
  return new Promise((resolve) => {
    Taro.request({
      url,
      data,
      method,
      header: {
        "content-type": "application/json"
      }
    }).then(res => {
      console.log(res);
      if (res.statusCode === 200) {
        resolve(res.data);
      } else {
        Taro.showToast({"title": "请求失败:"+res.data.error,"icon": "none"});
      }
    }).catch(err=>{
      Taro.showToast({"title": "网络错误,提示:"+err.errMsg,"icon": "none"});
    });
  });
}

后端响应码处理

对于后端返回的异常我们这里有两个处理方法

  • 1: 我知道这是异常,但是我会根据success处理,这里我不会reject(我采用的方案)
  • 2:我的系统较简单,直接reject处理 如果大家的系统比较简单,可以直接按照第二种来处理就行了,我解释一下为什么我不执行reject操作。 因为
  • 1:我们的系统处理的404和401等异常,会返回固定格式的data
  • 2:我们有自己的响应码来处理业务,例如返回编码为10001时需要加载页面等 我们在处理异常的时候先添加一个响应码白名单,在响应码白名单里的响应码不会弹窗,最终我们的request/index.tsx代码如下
import Taro from "@tarojs/taro";
const white_res_code = [200, 10001, 10002];
function request(url, data, method): Promise<any> {
  return new Promise((resolve) => {
    Taro.request({
      url,
      data,
      method,
      header: {
        "content-type": "application/json",
      },
    })
      .then((res) => {
        if (res.statusCode === 200) {
          const backEndRes = res.data;
          const resCode = backEndRes.code;
          console.log(backEndRes);
          if (!white_res_code.includes(resCode)) {
            switch (resCode) {
              case 500:
                return Taro.showToast({
                  title: "请求失败,系统异常:" + backEndRes.msg,
                  icon: "none",
                });
              case 401:
                return Taro.showToast({
                  title: "请求失败,请您登陆:" + backEndRes.msg,
                  icon: "none",
                });

              case 403:
                return Taro.showToast({
                  title: "请求失败,暂无权限:" + backEndRes.msg,
                  icon: "none",
                });

              default:
                return Taro.showToast({
                  title: "请求失败:" + res.data.error,
                  icon: "none",
                });
            }
          } else {
            resolve(backEndRes.data);
          }
          resolve(res.data);
        } else {
          Taro.showToast({ title: "请求失败:" + res.data.error, icon: "none" });
        }
      })
      .catch((err) => {
        Taro.showToast({ title: "网络错误,提示:" + err.errMsg, icon: "none" });
      });
  });
}
function get(url) {
  return request(url, null, "GET");
}

function post(url, data) {
  return request(url, data, "POST");
}
function del(url) {
  return request(url, null, "DELETE");
}
function put(url, data) {
  return request(url, data, "POST");
}
export { get, post, del, put };

其他代码大家可以访问我的git查看一下4月12日的修改记录就可以了

结语

今天我们处理了response的响应体优化与不同的响应code处理,我们已经完成了code的白名单,明天我们丰富一下请求路径的白名单,优化获取token和实现登录拦截的功能
本文的代码地址在:gitee.com/liangminghu… 欢迎大家多多关注