1 下载 引用。
npm install axios --save-dev
import axios from "axios"
2 这个时候 在组件中使用axios是需要每个组件都引一下axios的,比较麻烦,所以我们这样配置:
Vue.prototype.$myAxios = axios; //把axios挂载到vue上,$myAxios这个名称可以自定义
或者你也可以这样:
npm install vue-axios --save-dev
import Vueaxios from "vue-axios"
Vue.use(VueAxios,axios)
这样你就可以在任何组件使用啦。
3 get和post使用。
// get
this.$myAxios.get('你的url')
.then(function (response) {
console.log(response); // 成功
})
.catch(function (error) {
console.log(error); // 失败
});
// post
this.$myAxios.post('你的url', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response); / /成功
})
.catch(function (error) {
console.log(error); // 失败
});
// 第三种方法
this.$myAxios({
method: "post",//指定请求方式
url: " 你的url ",
data: {
id:"你的数据"
}
})
.then(function(res){
//接口成功返回结果执行
})
.catch(function(err){
//请求失败或者接口返回失败
})
这里还有一个问题,then()和catch()回调函数都有各自独立的作用域,如果直接在里面访问 this,无法访问到 Vue 实例。
then(function(res){
console.log(this.data)
}.bind(this))
这样就可以了。或者重新定义this也是可以的。
4 全局配置项。这样每一个axios实例都不用配置再次配置了。
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
//当然还可以这么配置
var instance = axios.create({
baseURL: 'https://api.example.com'
});
axios还有一些特殊的实例方法和配置项,具体方法请移步axios文档。
5 设置环境变量(测试环境,开发环境,生产环境),我们通过node的环境变量来匹配我们的默认的接口url前缀。axios.defaults.baseURL可以设置axios的默认请求地址。
// 环境的切换
if (process.env.NODE_ENV == 'development') {
axios.defaults.baseURL = 'https://www.baidu.com';}
else if (process.env.NODE_ENV == 'debug') {
axios.defaults.baseURL = 'https://www.ceshi.com';
}
else if (process.env.NODE_ENV == 'production') {
axios.defaults.baseURL = 'https://www.production.com';
}
6 设置请求超时。
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
7 post请求的时候,我们需要加上一个请求头,所以可以在这里进行一个默认的设置,即设置post的请求头为application/x-www-form-urlencoded;charset=UTF-8.
axios.defaults.headers.timeout = 5000;
8 设置拦截器。
/ 请求拦截器
axios.interceptors.request.use(
config => {
// 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
const token = store.state.token;
token && (config.headers.Authorization = token);
return config;
},
error => {
return Promise.error(error);
})
// 响应拦截器
axios.interceptors.response.use(
response => {
if (response.status === 200) {
return Promise.resolve(response);
} else {
return Promise.reject(response);
}
},
// 服务器状态码不是200的情况
error => {
if (error.response.status) {
switch (error.response.status) {
// 401: 未登录
// 未登录则跳转登录页面,并携带当前页面的路径
// 在登录成功后返回当前页面,这一步需要在登录页操作。
case 401:
router.replace({
path: '/login',
query: { redirect: router.currentRoute.fullPath }
});
break;
// 403 token过期
// 登录过期对用户进行提示
// 清除本地token和清空vuex中token对象
// 跳转登录页面
case 403:
Toast({
message: '登录过期,请重新登录',
duration: 1000,
forbidClick: true
});
// 清除token
localStorage.removeItem('token');
store.commit('loginSuccess', null);
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
setTimeout(() => {
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
}, 1000);
break;
// 404请求不存在
case 404:
Toast({
message: '网络请求不存在',
duration: 1500,
forbidClick: true
});
break;
// 其他错误,直接抛出错误提示
default:
Toast({
message: error.response.data.message,
duration: 1500,
forbidClick: true
});
}
return Promise.reject(error.response);
}
}
);
9 封装get post方法。
/**
* get方法,对应get请求
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
*/
export function get(url, params){
return new Promise((resolve, reject) =>{
axios.get(url, {
params: params
})
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err.data)
})
});
}
/**
* post方法,对应post请求
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
*/
export function post(url, params) {
return new Promise((resolve, reject) => {
axios.post(url, QS.stringify(params))
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err.data)
})
});
}
10 API管理。
/**
* api接口统一管理
*/
//从封装的axios中引入自己的get,post方法
import { get, post } from './http'
export const get1 = p => post('api/url1', p);
export const get2 = p => post('api/url2', p);
export const get3 = p => post('api/url3', p);
//在组建中使用
import { apiAddress } from '@/request/api';// 导入我们的api接口
export default {
name: 'Address',
created () {
this.onLoad();
},
methods: {
// 获取数据
onLoad() {
// 调用api接口,并且提供了两个参数
get1({
type: 0,
sort: 1
}).then(res => {
// 获取数据成功后的其他操作
………………
})
}
}
}