axios 请求接口封装

作者: 一只大橘 | 来源:发表于2019-08-09 10:59 被阅读3次

在项目开发中对于axios 的请求后台接口,获取数据,进行统一封装,对结果进行
统一处理。减少代码冗余,方便维护,废话不多说,进入正题开始axios封装。

一,设置请求体,请求格式


http.js 文件
import axios from 'axios';
import qs from 'qs';
//引入路由,在结果返回时,统一处理
import * as Routers from '../routers';
//常用的cookie 操作,自定义,这里就不贴出来了,自己封装就好
import { Cookie } from '../commons/tools';

const http = axios.create({});

//设置请求格式
http.defaults.headers = {
  'Content-Type': 'application/json',
};

http.defaults.transformRequest = [
  (p, headers) => {
    const param = {
      ...p,
    };
    switch (headers['Content-Type']) {
      case 'application/x-www-form-urlencoded':
        return qs.stringify(param);
      case 'application/json':
        return JSON.stringify(param);
      default:
        return param;
    }
  },
];

http.interceptors.response.use(
  (res) => {
    const rs = res.data;
    const rsType = ['code', 'status'];
    let isReturn = false;
    rsType.forEach((v) => {
      if (v in rs && rs[v] !== 0) {
        if (rs[v] === -9999) {
          // 如果请求接口  根据后台返回的状态进行统一处理
          Cookie.deleteCookie('sessionCode');
          sessionStorage.removeItem('UserInfo');
          localStorage.removeItem('UserInfo');
          sessionStorage.removeItem('sessionCode');
          localStorage.removeItem('sessionCode');
          const { origin, pathname } = window.location;
          window.location.href = `${origin}${pathname}#${Routers.Login}`;
        } else {
          throw rs;
        }
      } else {
        isReturn = true;
      }
    });
    if (isReturn) return rs.result || rs.data || null;
    return {};
  },
  (err) => {
    console.log(err);
    const success = false;
    return {
      success,
      err: `未知错误${err}`,
    };
  },
);

http.postForm = (
  url,
  data,
  config = {
    headers: {},
  },
) =>
  http.post(url, data, {
    ...config,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      ...config.headers,
    },
  });

export default http;

请求格式封装完后,中间有一层来调用统一的格式

--------------------------------------我就是史上最帅分割线,不接受反驳--------------------------


//这里贴出AppConfig 里的方法
//设置请求参数,此处的方法是获取本地sessionCode,登录时会往本地sessionStrange 存储后台返回的Token
class AppConfig {
    static isLogin = (loginParamField) => {
      if (loginParamField) {
        return loginParamField !== '0';
      }
      return false;
    }

    // static sessionCode = () => Cookie.getCookie('sessionCode');
    static sessionCode = () => localStorage.getItem('sessionCode');

    static accountId = () => {
      if (window.localStorage.getItem('cache_UserInfo')) {
        return JSON.parse(window.localStorage.getItem('cache_UserInfo')).accountId;
      }
      return '';
    }
}

export default AppConfig;

--------------------------------------我就是史上最帅分割线,不接受反驳-----------------------------------------
import HTTP from '../http'; //引入上文的 http.js 文件
import AppConfig from '../../commons/app_config';//引入app_config.js 文件

// 定义统一的接口路径
const getUserAddress = url => `${APP_CONFIG.URL}customer/${url}`;

// 用户相关接口
export default class UserApi {
  static queryBrokerageList(p) {
    return HTTP.post('此处应该是你的请求接口路径', { sessionCode: AppConfig.sessionCode(), ...p });
  }
}

总结:封装的方法返回数据的统一处理,请求路径的统一维护,减少代码的冗余,方便复用,
更方便前后端数据的交互。
始终遵循一个原则:一个方法,我们只做一件事,结构清晰透彻。
本案例可以直接使用,实践才是检验真理的唯一标准,如有不合理之处,请各位大佬
多多指教。

相关文章

网友评论

    本文标题:axios 请求接口封装

    本文链接:https://www.haomeiwen.com/subject/mrrcjctx.html