vue项目中使用axios时的请求拦截和封装
1、在src下创建目录utils,在utils下新建文件request.js
1 //request.js 2 3 import axios from 'axios'; 4 import { Message,Loading } from 'element-ui'; 5 const service = axios.create({ 6 baseURL:process.env.BASE_API, 7 timeout:10000 8 }) 9 let loadingInstance; 10 let options = { //loading 的配置参数 11 lock: true, 12 text: 'Loading', 13 spinner: 'el-icon-loading', 14 background: 'rgba(0, 0, 0, 0.7)' 15 } 16 //请求拦截器 17 service.interceptors.request.use(function(config){ 18 loadingInstance = Loading.service(options);//显示loading 19 config.data = config.data; //根据后端数据格式,可做相应的数据转换 JSON.stringify() 或 qs.stringify() 20 //设置header的配置信息,跟后端配合设置 21 // config.headers = { 22 // 'Content-Type':'application/x-www-form-urlencoded' 23 // } 24 25 //设置 token ,根据需要设置 26 // const token = getCookie('token'); 27 // if(token){ 28 // config.params = {'token':token}; 29 // config.headers.token = token; 30 // } 31 return config; 32 },function(error){ 33 loadingInstance.close(); //关闭loading 34 return Promise.reject(error) 35 }) 36 37 //响应拦截器 38 service.interceptors.response.use(function(response){ 39 loadingInstance.close(); //关闭loading 40 return response; 41 },function(error){ 42 loadingInstance.close(); //关闭loading 43 if(error || error.response){ 44 switch(error.response.status){ 45 case 400: 46 error.message = '错误请求'; 47 break; 48 case 401: 49 error.message = '未授权,请重新登录' 50 break; 51 case 403: 52 error.message = '拒绝访问' 53 break; 54 case 404: 55 error.message = '请求错误,未找到该资源'; 56 window.location.href = '/notFound'; 57 break; 58 case 405: 59 error.message = '请求方法未允许'; 60 break; 61 case 408: 62 error.message = '请求超时'; 63 break; 64 case 500: 65 error.message = '服务器端出错'; 66 break; 67 case 501: 68 error.message = '网络未实现'; 69 break; 70 case 502: 71 error.message = '网络错误'; 72 break; 73 case 503: 74 error.message = '服务不可用'; 75 break; 76 case 504: 77 error.message = '网络超时'; 78 break; 79 case 505: 80 error.message = 'http版本不支持该请求'; 81 break; 82 default: 83 error.message = `连接错误${error.response.status}` 84 } 85 }else{ 86 if(JSON.stringify(error).includes('timeout')){ 87 Message.error('服务器响应超时,请刷新当前页') 88 } 89 error.message('连接服务器失败') 90 } 91 92 Message.error(error.message) 93 return Promise.resolve(error.response) 94 }) 95 96 export default service
2、在 utils 目录下新建文件 http.js
1 //http.js 2 3 import request from './request'; 4 const http = { 5 get(url,params){ 6 const config = { 7 method:'get', 8 url:url 9 } 10 if(params) config.params = params; 11 return request(config) 12 }, 13 post(url,params){ 14 const config = { 15 method:'post', 16 url:url 17 } 18 if(params) config.data = params 19 return request(config) 20 }, 21 put(url,params){ 22 const config = { 23 method:'put', 24 url:url 25 } 26 if(params) config.params = params; 27 return request(config) 28 }, 29 delete(url,params){ 30 const config = { 31 method:'delete', 32 url:url 33 } 34 if(params) config.params = params; 35 return request(config) 36 } 37 } 38 39 export default http
3、在 src 目录下新建一个api 目录,并在api目录下新建文件 api.js
1 // api.js 2 3 import http from '../utils/http'; 4 let resquest = ''; //http://10.0.0.3:8080/getList.json //请求本地文件 5 let postUrl ="/postURL/info/supplement"; // http://10.0.0.3:8080/postURL/info/supplement //跨域--代理请求 6 7 //get 请求 8 export function getListAPI(params){ 9 return http.get(`${resquest}/getList.json`,params) 10 } 11 12 //post 请求 13 export function postFormAPI(params){ 14 return http.post(`${postUrl}`,params) 15 } 16 17 //put 请求 18 export function putSomeAPI(params){ 19 return http.put(`${resquest}/putSome.json`,params) 20 } 21 22 //delete 请求 23 export function deleteListAPI(params){ 24 return http.delete(`${resquest}/deleteList.json`,params) 25 }
4、引入并使用api请求接口
1 <script> 2 import {getListAPI,postFormAPI, putSomeAPI, deleteListAPI} from '@/api/api' //引入api 3 export default{ 4 data(){ 5 return{ 6 7 } 8 }, 9 methods:{ 10 getList(){ 11 //模拟的数据 12 let data = { 13 name:'lisi' 14 } 15 getListAPI(data).then(res =>{ 16 console.log(res) 17 }).catch(err =>{ 18 console.log(err) 19 }) 20 }, 21 postForm(){ 22 //模拟的数据 23 let data = { 24 username:"", 25 telnum:"", 26 } 27 postFormAPI(data).then(res =>{ 28 console.log(res) 29 }).catch(err =>{ 30 console.log(err) 31 }) 32 } 33 } 34 } 35 </script>
5、跨域代理设置---在当前项目下,新建一个 vue.config.js 文件,内容如下:
1 const webpack = require('webpack'); 2 module.exports = { 3 assetsDir: './', 4 publicPath: '/', 5 outputDir: './dist', 6 runtimeCompiler: undefined, 7 productionSourceMap: false, 8 filenameHashing: false, 9 parallel: undefined, 10 css: { 11 extract: false 12 }, 13 devServer: { 14 overlay: { // 让浏览器 overlay 同时显示警告和错误 15 warnings: true, 16 errors: true 17 }, 18 host: "10.0.0.3", 19 port: 8080, // 端口号 20 https: false, // https:{type:Boolean} 21 open: false, //配置后自动启动浏览器 22 hotOnly: true, // 热更新 23 // proxy: 'http://localhost:8080' // 配置跨域处理,只有一个代理 24 proxy: { //配置多个代理 25 "postURL": { 26 target: "http://218.17.135.100:8089", 27 changeOrigin: true, 28 //ws: true,//websocket支持 29 secure: false, 30 pathRewrite: { 31 "^/postURL": "/" 32 } 33 } 34 } 35 } 36 37 }