vue.cli项目封装全局axios,请求封装,封装公共的api和调用请求

vue.cli项目封装全局axios,请求封装,封装公共的api和调用请求

正文

1.vue项目的前期配置

新建vue的项目,下载axios ,并且在main.js中导入axios

npm i axios -S
//main.js
import axios from "axios"

2.配置config文件中的带地址

vuecli 3+ 新版本的代理配置 - vue.config.js文件

关于代理配置

	 devServer: {
            overlay: { // 让浏览器 overlay 同时显示警告和错误
              warnings: true,
              errors: true
            },
            host: "localhost",
            port: 8080, // 端口号
            https: false, // https:{type:Boolean}
            open: false, //配置后自动启动浏览器
            hotOnly: true, // 热更新
            // proxy: 'http://localhost:8080'   // 配置跨域处理,只有一个代理
            proxy: { //配置多个代理
                "/testIp": {
                    target: "http://197.0.0.1:8088",
                    changeOrigin: true,
                    ws: true,//websocket支持
                    secure: false,
                    pathRewrite: {
                        "^/testIp": "/"
                    }
                },
                "/elseIp": {
                    target: "http://197.0.0.2:8088",
                    changeOrigin: true,
                    //ws: true,//websocket支持
                    secure: false,
                    pathRewrite: {
                        "^/elseIp": "/"
                    }
                },
            }
        }

封装axios实例 —request.js

在项目src目录下新建utils文件夹,然后在里面新建request.js文件

// request.js
//导入axios
import axios from 'axios'
//使用element-ui Message做消息提醒
import {Message} from 'element-ui'

//1.创建新的axios 实例
const service = axios.create({
//公共接口
baseURL:process.env.BASE_API,
//超时时间,单位是ms
timeout:3*1000
})

//2.请求拦截器
service.interceptors.request.use(config=>{
//发送请求之前要做数据处理,数据转换,配置请求头,设置token,设置loading
config.data = JSON.stringify(config.data)//数据转化,也可以使用qs.stringify(区别是后台需要的数据格式)
 config.headers = {
     'Content-Type':'application/x-www-form-urlencoded' //配置请求头
   }
   //注意使用token的时候需要引入cookie方法或者本地的localStorage等方法
   const token = getCookie('名称');//使用这个方法之前,你需要首先拿到token值
   if(token){
   config.params = {'token':token}//如果要求携带在参数中
   config.headers.token = token //如果要求携带在请求头中
}
return config
},error=>{
Promise.reject(error)
}
})

//3.响应拦截器
service.interceptors.response.use(response => {
  //接收到响应数据并成功后的一些共有的处理,关闭loading等
  
  return response
}, error => {
   /***** 接收到异常响应的处理开始 *****/
  if (error && error.response) {
    // 1.公共错误处理
    // 2.根据响应码具体处理
    switch (error.response.status) {
      case 400:
        error.message = '错误请求'
        break;
      case 401:
        error.message = '未授权,请重新登录'
        break;
      case 403:
        error.message = '拒绝访问'
        break;
      case 404:
        error.message = '请求错误,未找到该资源'
        window.location.href = "/NotFound"
        break;
      case 405:
        error.message = '请求方法未允许'
        break;
      case 408:
        error.message = '请求超时'
        break;
      case 500:
        error.message = '服务器端出错'
        break;
      case 501:
        error.message = '网络未实现'
        break;
      case 502:
        error.message = '网络错误'
        break;
      case 503:
        error.message = '服务不可用'
        break;
      case 504:
        error.message = '网络超时'
        break;
      case 505:
        error.message = 'http版本不支持该请求'
        break;
      default:
        error.message = `连接错误${error.response.status}`
    }
  } else {
    // 超时处理
    if (JSON.stringify(error).includes('timeout')) {
      Message.error('服务器响应超时,请刷新当前页')
    }
    error.message('连接服务器失败')
  }

  Message.error(error.message)
  /***** 处理结束 *****/
  //如果不需要错误处理,以上的处理过程都可省略
  return Promise.resolve(error.response)
})

//4.导入文件
export default service

封装请求—http.js

在项目src目录中下的utils的文件夹中新建http.js文件

//http.js
//导入封装好的axios实例
import request from './request'
const http={
  get(url,params){
    const config={
       method :'get',
       url:url
    }
    if(params) config.params = params
    return request(config)
},
  
  post(url,params){
        const config = {
            method: 'post',
            url:url
        }
        if(params) config.data = params
        return request(config)
    },

  delete(url,params){
        const config = {
            method: 'delete',
            url:url
        }
        if(params) config.params = params
        return request(config)
    },
    
   put(url,params){
        const config = {
            method: 'put',
            url:url
        }
        if(params) config.params = params
        return request(config)
    },
}
//导出
export default http

5.正式封装API,用于发送请求—api.js

在项目src 目录下新建api文件夹,然后在其中新建api.js文件,这个文件是主要书写api封装过程

import http from '../utils/http'
let request = '/testIP/request'

//get请求
export function getListAPI(params){
   return http.get(`${request}/getForm.json`,params)

//put请求
export function putListAPI(params){
   return http.put(`${request}/putForm.json`,params)
}

//post请求
export function postListAPI(params){
   return http.post(`${request}/postForm.json`,params)
}

//delete请求
export function deleteListAPI(params){
   return http.delete(`${request}/deleteForm.json`,params)
}

如何在vue文件中使用

方法1.用到哪个api 就调用哪个接口

import {getListAPI,putListAPI,postListAPI,deleteListAPI} from '@/api/api'

methods:{
//promise 调用,链式调用,getList()括号内只接受参数
getList() {
        getListAPI().then(res => console.log(res)).catch(err => console.log(err))
      },
		//post传参
      postListAPI(formData) {
        let data = formData
        postFormAPI(data).then(res => console.log(res)).catch(err => console.log(err))
      },
      //async await同步调用
      async postForm(formData) {
        const postRes = await postFormAPI(formData)
        const putRes = await putSomeAPI({data: 'putTest'})
        const deleteRes = await deleteListAPI(formData.name)
        // 数据处理
        console.log(postRes);
        console.log(putRes);
        console.log(deleteRes);
      },
}

方法2:把所有的api全部导入,然后用哪个就调用哪个api

import api from '@/api/api'
 methods: {
     getList() {
        api.getListAPI(data).then(res => {
          //数据处理
        }).catch(err => console.log(err))
      }
    }  

你可能感兴趣的:(vue,http)