上代码
import axios from 'axios'
import qs from 'qs'
// 请求前
// 会根据项目的开发,生产测,试环境不一样而对应不同地址 (接口)
// 如果出现cors跨域方式,向服务器发送请求时,允许我们带自行凭证(携带cookie),不能每次都需要单独写一遍 需要提前都处理掉,
// post请求格式需要其他处理服务器接受1、JSON格式2、urlencoded格式,统一处理好(不在每发一次就单独处理一次)
// 在服务器发请求时,某些操作导致请求错误,也需要统一处理
// 返回结果
// 当从服务器拿回来结果时,需要告诉我成功还是失败,失败的原因,如果返回401 未认证,可以做统一处理跳到登录页面,再或者断网了也需要自己处理
// 统一配置好,提前封装,操作更简单
// axios.get(url,{
// params:{
// }
// }).then(response=>{
// }).catch(error=>{
// })
/**
* 1、根据环境变量进行接口区分
* baseURL:公共前缀
*/
switch(process.env.NODE_ENV) {
case "production":
axios.defaults.baseURL = 'http://api.baidu.com';
break;
case "test":
axios.defaults.baseURL = 'http://192.168.20.12:8080'
break
default:
axios.defaults.baseURL = 'http://127.0.0.1:3000'
}
/**
* 设置超时请求时间
*/
axios.defaults.timeout = 10000;
/**
* 设置cors跨域允许携带资源凭证
*/
axios.defaults.withCredentials = true
/**
* 设置post请求头:告知服务器请求主题的数据格式
* post 请求想写成 xxx=xxx&xxx=xxx的形式 (get请求就是这种格式)
* 设置请求传递数据的格式
* 这种格式交 x-www-form-urlencoded
* 看请求数据的格式(服务器要求什么格式)不要求就不设置
*/
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'
axios.defaults.transformRequest = data=>{
qs.stringify(data)
}
// axios.post(url,data) data是一个对象
/**
* 设置请求拦截器
* 客户端 -》 请求拦截器-》服务器
* token校验(JWT)每次客户端向服务器发送请求时,都需要客户端带上token,这个在请求拦截时就需要做处理
* token也有个过期时期,
* 接收服务器返回的token,存储到vuex/本地存储(或者其他)
*
*/
// config是轻松请求的时候带的配置项
axios.interceptors.request.use(config=>{
// 携带token
let token = localStorage.getItem('token')
// 判断token必须得存在,然后做在请求头部设置 Authorization
token && (config.headers.Authorization = token)
// 如果不返回配置项,发给服务器的内容就是空的
return config
},error=>{
return Promise.reject(error)
})
/**
* 响应拦截器
* 服务器返回信息 -》 【拦截统一处理】 -》 客户端JS获取信息
*/
axios.defaults.validateStatus = status =>{
// 自定义响应成功的HTTP状态码 返回 大于200小于300 默认2开头的都默认返回成功
return /^(2|3)\d{2}$/.test(status)
}
axios.interceptors.response.use(response=>{
// 状态码2开头成功返回的数据
return response.data
},error=>{
let {response} = error
if(response){
// 服务区返回结果
switch(response.status){
case 401://当前请求需要用户验证(一般未登录) 权限
break;
case 403://服务器已经理解请求,但是拒绝执行他(一般是token过期)
break
case 404: //找不到页面
break;
}
}else{
// 服务器没有返回结果1、服务器蹦了,2、客户端没网需要做断网处理(window身上有个内置对象 window.navigator.onLine)
if(!window.navigator.onLine){
// 断网处理,可以跳到断网页面
return
}
return Promise.reject(error)
}
})
// 暴露axios接口
export default axios