react + axios实践
2017-09-21 本文已影响3011人
Hyacinthhhhh
本文只要介绍如何在项目中把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);
};
4、发送请求并处理请求返回数据
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){
//当这两个请求都完成的时候会触发这个函数,两个参数分别代表返回的结果
}))
到此,就是一个完整的从请求发送->拦截请求->请求响应->拦截响应->处理返回数据。