react + axios实践

本文只要介绍如何在项目中把react和axios结合起来使用,想了解更多关于axios详细知识以及api,可以到官网查看 https://www.npmjs.com/package/axios

首先安装 axios

$npm install axios  或  $yarn install axios

代码中引入axios

import axios from 'axios';

写一个拦截所有请求的axios全局拦截器

import axios from 'axios';
import globalCode from '../constants/globalCode'; 
import { Toast } from 'antd-mobile';
import {createHashHistory} from 'history';
import commonInfo from '../common/CommonInfo';

const instance = axios.create({
    //当创建实例的时候配置默认配置
    xsrfCookieName: 'xsrf-token'
});

//添加请求拦截器
instance.interceptors.request.use(function(config){
        //在发送请求之前做某事,比如加一个loading
        if(commonInfo.hasLoading){
            Toast.loading('', 3);
        }

        return config;
    },function(error){
        //请求错误时做些事
        Toast.hide();
        return Promise.reject(error);
});

//添加一个响应拦截器
instance.interceptors.response.use(function (response) {
    // 1.成功
    if (response.data.success && response.data.messageCode === globalCode.success) {
        if(commonInfo.hasLoading){
            Toast.hide();
        }
        return response.data.data;
    }

    // 2.session过期
    if (!response.data.success && response.data.messageCode === globalCode.timeout) {
        Toast.hide();
        Toast.info("会话过期,请重新登录", 1);
        createHashHistory().push('/login');

        // 定义一个messagecode在后面会用到
        return  Promise.reject({
            messageCode: 'timeout'
        })
    }

    // 3.11111111 系统异常、网络异常
    if (response.data.success && response.data.messageCode === globalCode.busyCode) {
        Toast.hide();
        Toast.info(response.data.message, 1);
        return  Promise.reject({
            messageCode: 'netError'
        })
    }

    // 3.其他失败,比如校验不通过等
    return Promise.reject(response.data);
}, function () {
    Toast.hide();
    // 4.系统错误,比如500、404等
    Toast.info('系统异常,请稍后重试!', 1);
    return Promise.reject({
        messageCode: 'sysError'
    });
});

export default instance;

引用 axios 的 instance 实例

mport API from '../../config/api';
import instance from '../utils/axiosCore';

// PS:此处如果对请求参数格式有疑问的可以查看官网资料,此处就不一一做详细解释了
// get
export const login = (params) => {
   return instance.get(API.LOGIN_API, { params: params });
};

// post
export const getConsultant = (params) => {
   return instance.post(API.GET_CONSULTANT_API, params);
};

发送请求并处理请求返回数据

import { login } from '../../models/loginModel';

login = () => {
        let params = {
           username: "admin",
           password: "123456"
        };
      
        login (params).then((data) => {
            //此处为正常业务数据的处理
           
        }, (data) => {
            if (data.messageCode !== 'netError' && data.messageCode !== 'sysError' && data.messageCode !== 'timeout') {
                //此处是对除了以上几个系统异常意外的业务异常的处理
                Toast.info(data.message, commonInfo.showToastTime);
            }
        });
    };


// 一次性并发多个请求
axios.all([getUserAccount(),getUserPermissions()])
  .then(axios.spread(function(acct,perms){
    //当这两个请求都完成的时候会触发这个函数,两个参数分别代表返回的结果
  }))

到此,就是一个完整的从请求发送->拦截请求->请求响应->拦截响应->处理返回数据。

上面的apis 文件可以用下面的方法写

封装一个匿名函数返回一个apis对象,通过apis对象的键名去获取对应的api地址

// 集中管理路由,所有的接口地址:
//  1.整个应用用到了哪些接口一目了然
//  2.接口地址可能变化,方便管理
​
const prefix = '' // api地址前缀
export default(config => {
    return Object.keys(config).reduce((copy, name) => {
      copy[name] = `${prefix}$config[name]`
      return copy
    })
})({
  // example api
  "getExampleData": "/api/example/data" 
})
​

文件最终返回一个对象

// api对象
{
  getExampleData: '/api/example/data'
}
原文地址:https://www.cnblogs.com/xzqyun/p/9518882.html