import axios from "axios" import querystring from "querystring" // Axios网络请求封装放在了utils文件夹里面,也就是这个文件 // Axios网络请求封装文档:https://www.kancloud.cn/yunye/axios/234845 //额外补充:一般情况下,网络请求会放在api文件夹里面,utils文件夹里面放的是网络请求封装的方法也就是这个文件 //推荐一个好用的接口站点:iwenwiki.com 进去之后选测试接口,再选blueberrypai //处理拿到的错误信息,网络请求的错误处理方案。switch堆,监听各种可能的状态码,方便让我们查找哪里出的问题 const errorHandle = (status,info) => { //status是状态码信息,info是具体错误信息 switch(status){ case 400:{ console.log("语义有误"); break; } case 401:{ console.log("服务器认证失败"); break; } case 403:{ console.log("服务器拒绝访问"); break; } case 404:{ console.log("地址错误"); break; } case 500:{ console.log("服务器遇到意外"); break; } case 502:{ console.log("服务器无响应"); break; } default://如果上面的状态码都不是报错的原因,就把具体的错误信息打印出来 console.log(info); break; } } //创建网络请求对象 const instance = axios.create({ //网络请求的公共配置 timeout:5000 //超时时间,网络请求如果超过5秒还没有得到数据,就退出请求 }) //【拦截器,分为两类:发送数据之前、获取数据之前】。通过use方法处理拦截器 //1、发送数据之前 instance.interceptors.request.use( // //成功的函数 // function(){}, // //失败的参数 // function(){} //把上面两个函数写成箭头函数,会比较简洁 //发送拦截器成功时的函数 config =>{ //method:请求方法 if(config.timeout === "post"){ //在拦截器里面就把参数转换一下,以后使用就不用转换了,转换之后再赋值给config config.data = querystring.stringify(config.data) } //config:包含着网络请求的所有信息,把上面处理好的configreturn出来 return config; }, //发生拦截器失败时的函数 error =>{ return Promise.reject(error) } ) //2、获取数据之前。response是响应对象 instance.interceptors.response.use( //成功时的函数 response =>{ //通过判断状态码是否等于200,是就通过Promise把失败的resolve返回数据,否就通过Promise把失败的reject返回出去,response是返回的数据 return response.status === 200 ? Promise.resolve(response) : Promise.reject(response) }, //网络请求发送或接收失败时的函数,即发生过程出现了问题 error =>{ const { response } = error;//response代表错误的信息 //处理拿到的错误信息,在本文件的顶部有写errorHandle错误函数,这里就直接调用一下errorHandle, //把response的状态码status返回出来,把response的错误信息info返回出来 errorHandle(response.status,response.info) } ) //导出网络请求 export default instance;