vue之axios的封装使用
注意:先在项目里面安装axios,以下注释的地方可以直接删除,不影响功能实现
新建文件 api 和 service和 config
1、service文件下新建如图文件
index.js
import axios from 'axios';
// import {Toast} from 'vant';
import qs from 'qs';
// import {getToken,getAgentId,removeToken} from '@/utils/util'
import config from '@/config'
import Vue from 'vue'
let $vue = new Vue
const URL = process.env.NODE_ENV === 'development' ? config.baseUrl.dev : config.baseUrl.pro
/**
* 创建axios实例
* @type {AxiosInstance}
*/
axios.defaults.timeout = 10000;
axios.defaults.baseURL = URL; //填写域名
/**
* 请求参数处理
*/
axios.interceptors.request.use((config) => {
// let user = JSON.parse(sessionStorage.getItem('user'));
// const agentId = getAgentId();
// if(config.data && agentId){
// config.data.agentId = agentId
// }
// if(config.params && agentId){
// config.params.agentId = agentId
// }
// console.log(config)
if(config.isNeedToken){
console.log("请求需要token")
}
config.method === 'post'
? config.data = qs.stringify({...config.data})
: config.params = {...config.params}
// const token = getToken()
// if (token) {
// config.headers['Authorization'] = 'Bearer ' + token
// }
// if(config.isNeedToken && !token){
// try {
// // 再次调用原生方法,获取token
// // u.native.getUserInfo()
// const token = getToken()
// config.headers['Authorization'] = 'Bearer ' + token
// console.log("再次调用原生方法获取token")
// } catch (error) {
// console.log("原生方法未注入", error);
// }
// }
// 用于测试的token值 login登录更新token
// config.headers['Authorization'] = 'Bearer ' + "7816014465510072321f41238a-c847-4ff1-9381-e641bc2d5f16" //188 测试
// config.headers['Authorization'] = 'Bearer ' + "78116742149561958402382f7d-483f-4fc3-b934-e6fc9ee3ce4a" //156
// config.headers['Authorization'] = 'Bearer ' + "801756553907535872602001db-4c23-4949-8596-9daeda65bd40" //测试
// config.headers['Authorization'] = 'Bearer ' + "803320347343454208a23f2d16-0cf4-4af4-bd02-f3ad6b24996e"
// config.headers['Authorization'] = 'Bearer ' + "79849685364034764858d5eee5-1924-4f94-9bf9-e15e3d6f8b76" //188 正式
console.log("请求的token",config.headers['Authorization'])
// if(config.isLoading){
// Toast.loading({
// message: '加载中...',
// forbidClick: true,
// overlay:false,
// duration:0
// });
// }
return config
}
)
//响应拦截器即异常处理
axios.interceptors.response.use(
(response) => {
// Toast.clear();
if (response.data.code === 0) {
// 服务端定义的响应code码为0时请求成功
// 使用Promise.resolve 正常响应
return Promise.resolve(response.data)
} else if(response.data.code == 5000){
// 使用Promise.reject 响应
// Toast({message: response.data.message, position: 'bottom', duration: 1000});
return Promise.reject(response.data)
}
}, error => {
let message = ''
console.log("请求错误-------------",error);
if (error && error.response) {
switch (error.response.status) {
case 401:
// location.reload()
if(error.response.data.code === 2012){
// Toast({message: '请重新登录', position: 'bottom', duration: 1000});
// 判断token是否失效 失效去登录
// removeToken()
// if($vue.$getUserAgent() == 0){
// try{
// u.native.toLogin()
// }catch (e) {
// console.log("原生方法未注入", e)
// }
// }else{
// try{
// window.webkit.messageHandlers.toLogin.postMessage({});
// }catch (e) {
// console.log("ios方法未注入", e)
// }
// }
}
return
case 403 || 400:
message = error.response.data.path + ',' + error.response.data.message
break
case 500:
message = '网络繁忙,请稍后再试'
break
case 502:
message = '连接服务器失败'
break
default:
message = error.response.data.message ? error.response.data.message : '网络繁忙,请稍后再试'
break
}
// Toast({message: message, position: 'bottom', duration: 1000});
// 请求错误处理
return Promise.reject(error)
} else {
message = '网络繁忙,请稍后再试'
// Toast({message: message, position: 'bottom', duration: 1000});
return Promise.reject(error)
}
}
)
export default axios
postJson.js
import axios from 'axios';
// import {Toast} from 'vant';
// import {getToken,getAgentId,removeToken} from '@/utils/util'
import config from '@/config'
import Vue from 'vue'
let $vue = new Vue
const URL = process.env.NODE_ENV === 'development' ? config.baseUrl.dev : config.baseUrl.pro
/**
* 创建axios实例
* @type {AxiosInstance}
*/
const service = axios.create({
baseURL: URL, // api的base_url
timeout: 30000 // 设置请求超时时间30s
})
/**
* 请求参数处理
*/
service.interceptors.request.use((config) => {
// let user = JSON.parse(sessionStorage.getItem('user'));
// const agentId = getAgentId();
// if(config.data && agentId){
// config.data.agentId = agentId
// }
// if(config.params && agentId){
// config.params.agentId = agentId
// }
// if(user && user.shop && user.shop.agentId){
// if(config.data){
// config.data.agentId = user.shop.agentId
// }
// if(config.params){
// config.params.agentId = user.shop.agentId
// }
// }
config.method === 'post'
? config.data = {...config.data}
: config.params = {...config.params}
// const token = getToken()
// if (token) {
// config.headers['Authorization'] = 'Bearer ' + token
// }
// if(config.isNeedToken && !token){
// try {
// console.log("再次获取token")
// // 再次调用原生方法,获取token
// // u.native.getUserInfo()
// const token = getToken()
// config.headers['Authorization'] = 'Bearer ' + token
// } catch (error) {
// console.log("原生方法未注入", error);
// }
// }
// 用于测试的token值 login登录更新token
// config.headers['Authorization'] = 'Bearer ' + "7816014465510072321f41238a-c847-4ff1-9381-e641bc2d5f16" //188 测试
// config.headers['Authorization'] = 'Bearer ' + "78116742149561958402382f7d-483f-4fc3-b934-e6fc9ee3ce4a" //156
// config.headers['Authorization'] = 'Bearer ' + "801756553907535872602001db-4c23-4949-8596-9daeda65bd40" //家
// config.headers['Authorization'] = 'Bearer ' + "803320347343454208a23f2d16-0cf4-4af4-bd02-f3ad6b24996e"
// config.headers['Authorization'] = 'Bearer ' + "79849685364034764858d5eee5-1924-4f94-9bf9-e15e3d6f8b76" //188 正式
console.log("请求的token",config.headers['Authorization'])
return config
}
)
//响应拦截器即异常处理
service.interceptors.response.use(
(response) => {
if (response.data.code === 0) {
// 服务端定义的响应code码为0时请求成功
// 使用Promise.resolve 正常响应
return Promise.resolve(response.data)
} else {
// 使用Promise.reject 响应
// Toast({message: response.data.message, position: 'bottom', duration: 1000});
return Promise.reject(response.data)
}
}, error => {
let message = ''
console.log(error)
if(error && error.response){
switch (error.response.status) {
case 401:
if(error.response.data.code === 2012){
// Toast({message: '请重新登录', position: 'bottom', duration: 1000});
// 判断token是否失效
// removeToken()
// if($vue.$getUserAgent() == 0){
// try{
// u.native.toLogin()
// }catch (e) {
// console.log("原生方法未注入", error)
// }
// }else{
// try{
// window.webkit.messageHandlers.toLogin.postMessage({});
// }catch (e) {
// console.log("ios方法未注入", error)
// }
// }
}
return
case 403 || 400:
message = error.response.data.path + ',' + error.response.data.message
break
case 500:
message = '网络繁忙,请稍后再试'
break
case 502:
message = '连接服务器失败'
break
default:
message = error.response.data.message ? error.response.data.message : '网络繁忙,请稍后再试'
break
}
// Toast({message: message, position: 'bottom', duration: 1000});
// 请求错误处理
return Promise.reject(error)
} else {
message = '网络繁忙,请稍后再试'
// Toast({message: message, position: 'bottom', duration: 1000});
return Promise.reject(error)
}
}
)
export default service
两个文件的区别在于请求参数config.method的处理
2、config文件下新建index.js
export default {
/**
* @description token在Cookie中存储的天数,默认7天
*/
cookieExpires: 7,
/**
* @description api请求基础路径
*/
baseUrl: {
dev:'http://test.xxx.com',
pro:'http://test.xxx.com/',
},
// projectName:'xxxx',
/**
* @description 默认打开的首页的路由name值,默认为home
*/
// homeName: 'home'
}
3、api文件下新建你需要的文件 这里的test.js仅用于测试
test.js
import request from '@/service/index'
import postJson from "@/service/postJson"
// 获取地区的筛选
/**
* 无参数
*/
export const getCityArea = () => {
return request({
url: 'xxxxxx',
method: 'get',
isLoading:true,
})
}
使用封装的axios接口,请求数据
<template>
<div class="home">
<div class="fz-14">home</div>
</div>
</template>
<script>
import {getCityArea} from '@/api/test'
export default {
name: 'home',
data() {
return {
}
},
created(){
this.getData()
},
computed:{
},
methods:{
async getData(){
let res = await getCityArea()
}
},
}
</script>
<style lang="scss" scoped>
.test{
font-size: 24px;
}
</style>
成功获取到接口的数据,此时axios的封装完成,有什么需要的可以继续添加到以上对应文件里面。