vue项目用promise 封装 axios请求 get和post

第一步 下载axios
npm install axios --save
第二步 新建文件
  • 先在src文件夹里 新建一个 utils文件夹
  • 在 utils 文件里建一个axios.js 文件
  • 复制代码放进去
  • 下面的响应拦截和请求拦截的参数比如token,根据自己项目修改,不需要的话可以注释掉
  • 除了这get 和 post请求,还有delete,put之类的请求方式,就把写get的地方替换成需要的请求方式,就OK,原理是一样的
// 引入
import axios from "axios";
// 设置axios
const service = axios.create({
    // 设置最大请求事件
    timeout: 1000 * 60,
    // 设置基础路径 
    baseURL: "/api" 
})
// 封装post请求
let post = function (url, data_ = {}) {
    return new Promise((resolve, reject) => {
        service.post(url, data_).then((res) => {
            // 成功
            return resolve(res)
        }).catch((err) => {
            // 失败
            return reject(err)
        })
    })
}
let get = function(url,data_ ={}){
    return new Promise((resolve, reject) => {
        let params = data_;
        service.get(url, {
            params
        }).then((res) => {
            // 成功
            return resolve(res)
        }).catch((err) => {
            // 失败
            return reject(err)
        })
    })
}

// 添加请求拦截
service.interceptors.request.use(config => {
    // 添加请求头
    config.headers = {
        "authorization": localStorage.token 
    }
    return config;
})
// 添加响应拦截
service.interceptors.response.use(response=> {
    return response.data
}, error=> {
    // 返回一个错误提示信息 ,处理http网络错误
    let message = ''
    let status = error.response.status
    switch (status) {
        case 400:
            message = '请求错误'
            break
        case 401:
            message = '未授权,请登录'
            break
        case 403:
            message = '拒绝访问'
            break
        case 404:
            message = `请求地址出错: ${error.response.config.url}`
            break
        case 408:
            message = '请求超时'
            break
        case 500:
            message = '服务器内部错误'
        default:
            message = '网络错误了...'
    }
    // 提示错误信息
    ElMessage.error(message)  // 这里用了一个element 的提示框,就是用来展示一下报错信息
    return Promise.reject(error)
})

// 导出
export default {
    post,
    get,
}
第三步 使用
  • 可以再建一个api文件夹(src文件下面)
    在这个api文件夹里 在建的js文件就可以分一下类了
    (比如 要获取菜单列表的请求,可以用一个js文件在存放。获取用户信息的请求,可以用另一个js文件来存放。)
  • 下面是每个 js 文件的基本格式
//这一句就是引入刚才建好的 axios.js文件
import axios from "../utils/axios"

// 一个登录请求
//把接口地址写好,因为它是不变的,变的是数据,可以在页面使用的时候传过来
function dl(data){
   return  axios.post('/admins/login',data) 
}

// 这一步就是导出方法  
// 比如这个方法原名是 dl 给他从命名了一个login 所以在用的时候就用的是login这个名字
// 这么写的目的就是,在方法名过长或者不够语义化的时候,可以修改一个更合适的
export {
    dl as login
}
  • 然后就是在页面中怎么使用了
<script setup>
import { ref } from "vue";
//先引一下 刚才写好的js文件,我这个文件叫admins
import { login } from "../api/admins";

let inp = ref("");
let pw = ref("");
// 在点击方法里面可以执行这个login 请求
async function btn(){
 //在里面 传一个 对象
    let res = await login({
    ad_phone: inp.value,
    ad_pw: pw.value,
  });
//下面就可以接收res的值,做判断了,可以先看看res返回的是什么
console.log(res);

}
</script>
第五步 解决跨域
  • 在vite.config.js里面 只需要 用 ----框起来的(这是vue3的)
  • target 哪里是写后端地址的,自己是啥就写啥
export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  // 设置跨域  vue3配置跨域--------
  server:{
   proxy:{
      '/api':{ // 需要注意的是这里的 /api 要与utils文件下面的axios.js文件的基础路径保持一致
        target:"http://localhost:3000", // 后端地址
        changeOrigin:true,
        rewrite: (path) => path.replace(/^\/api/,'')
      }
    }
  }
  //-----------
})
  • vue2 是这样的
  devServer: {
    proxy: {
      "/api": {
        target: "http://localhost:3000",
        changeOrigin: true,//是否跨域
        pathRewrite: {//路径是否重定义
          "^/api": "", 
        }
      }
      
    }
  }

然后就全部ok了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容