首页 > 其他分享 >Vue3集成axios分环境调用

Vue3集成axios分环境调用

时间:2023-02-20 11:56:54浏览次数:35  
标签:case axios service Vue3 break 调用 error import message

版本

  • node 16.18.0
  • Vue3

配置基础环境

  • 安装axios
npm install axios
  • 编写dev与prod环境文件 dev
NODE_ENV='development'

prod

NODE_ENV='production'
  • 动态配置环境信息
export interface IConfig {
  env: string // 开发环境
  mock?: boolean // mock数据
  title: string // 项目title
  baseUrl?: string // 项目地址
  baseApi?: string // api请求地址
  APPID?: string // 公众号appId  一般放在服务器端
  APPSECRET?: string // 公众号appScript 一般放在服务器端
}

const dev: IConfig = {
  env: "development",
  mock: false,
  title: "开发",
  baseUrl: '/api', 
  baseApi: "http://127.0.0.1:8080", 
  APPID: "17970",
  APPSECRET: "zuiyu"
}

const prod: IConfig = {
  env: "production",
  mock: false,
  title: "生产",
  baseUrl: "/api",
  baseApi: "http://localhost:8080", 
  APPID: "17970",
  APPSECRET: "zuiyu"
}
export const config: IConfig = import.meta.env.MODE == 'development' ? dev : prod
  • 打包修改配置 package.json,修改build-only如下,主要增加 --mode production
  "scripts": {
    "dev": "vite",
    "build": "run-p type-check build-only ",
    "build-only": "vite build --mode production"
    }
  • 封装request.js


import axios from "axios";
// import router from  "@/router";
import  {config}  from "@/config/index.ts";
const service = axios.create({
  // baseURL 需要设置为反向代理前缀,不能设置绝对路径URL
  baseURL: config.baseUrl, 
  timeout: 5000,
  withCredentials: false, 
  headers: {'X-Custom-Header': 'zuiyu'}
})
service.defaults.headers.common['Authorization'] = "AUTH_TOKEN";
service.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
service.defaults.headers.get['Content-Type']='application/x-www-form-urlencoded'
// 添加请求拦截器
service.interceptors.request.use(function (req) {
  // 在发送请求之前做些什么
  console.log('请求前拦截器1:',config)
  console.log('请求前拦截器2:',req)
  // if (config.loading) {

  // }
  return req;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});
//添加响应拦截器
service.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  const res = response.data;
    if (res.code !== 200) {
      // token 过期
      if (res.code === 401)
        // 警告提示窗
        return;
      if (res.code == 403) {
        return;
      }
      // 若后台返回错误值,此处返回对应错误对象,下面 error 就会接收
      return Promise.reject(new Error(res.msg || "Error"));
    }
    return response;
}, function (error) {
  // 对响应错误做点什么
  if (error && error.response) {
    switch (error.response.status) {
      case 400:
        error.message = "请求错误(400)"
        break
      case 401:
        error.message = "未授权,请登录(401)"
        break
      case 403:
        error.message = "拒绝访问(403)"
        break
      case 404:
        error.message = `请求地址出错: ${error.response.config.url}`
        break
      case 405:
        error.message = "请求方法未允许(405)"
        break
      case 408:
        error.message = "请求超时(408)"
        break
      case 500:
        error.message = "服务器内部错误(500)"
        break
      case 501:
        error.message = "服务未实现(501)"
        break
      case 502:
        error.message = "网络错误(502)"
        break
      case 503:
        error.message = "服务不可用(503)"
        break
      case 504:
        error.message = "网络超时(504)"
        break
      case 505:
        error.message = "HTTP版本不受支持(505)"
        break
      default:
        error.message = `连接错误: ${error.message}`
    }
  } else {
    if (error.message == "Network Error") error.message == "网络异常,请检查后重试!"
    error.message = "连接到服务器失败,请联系管理员"
  }
  return Promise.reject(error);
});

export default service
  • 配置反向代理地址 根目录 vite.config.ts
import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(), vueJsx()],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  server: {
    cors: true, // 默认启用并允许任何源
    open: true, // 在服务器启动时自动在浏览器中打开应用程序
    port: 5173,
    proxy: {
      '^/api': {
        target: 'http://127.0.0.1:8080/',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '')
        
      },
    }
  }
})

调取后台接口

  • 编写测试api.js
import service from '@/util/request.js'
export const testGetMethod = () => service.get('/test/get')
export const testGetHaveParamsMethod =
    (params) => service.get('/test/getHaveParams',{params:params})

export const testPost = (params) =>
    service.post('/test/post',
        params,
        {
            headers: {"Content-Type": "application/x-www-form-urlencoded"}
        }
)
export const testPostJson =
    (params) => service.post('/test/postJson',params)

export const testPostFile =
    (params) => service.post('/test/postFile',params,{
        headers: {"Content-Type": "application/x-www-form-urlencoded"}
    })
    • 接口调用
      import {testPostFile} from "@/api/api";
      // 或者引入全部使用
      import TestApi from "@/api/api";
      const uploadFile = (fileReqOpt) => {
      let fd = new FormData()
      fd.append("file",fileReqOpt.file)
      fd.append("params","自定义参数")
      testPostFile(fd)
      }
      // 或者
        async function test() {
        let p ={
          params: "参数1",
          file: "file"
        }
        let result = await testPostFile(p);
      }

标签:case,axios,service,Vue3,break,调用,error,import,message
From: https://www.cnblogs.com/stry/p/17136829.html

相关文章

  • Vue3根据菜单动态生成路由
    前言学无止境,无止境学。大家好,我是张大鹏,之前在抖音有5万多粉丝,不过现在不拍视频,专心写公众号了。笔者目前是高级Python工程师,之前是全栈工程师,主要擅长Golang和Python开......
  • Vue3开箱即用中后台管理资源推荐
    Vue3-admin-element-template基于Vue3、Vite2、Element-Plus、Vue-i18n、Vue-router4.x、Vuex4.x、Echarts5等最新技术开发的中后台管理模板官方文档:文档地址Gin-vue-a......
  • QML调用C++程序
    QML调用C++程序1.添加C++,MouseMemory文件(.h,.cpp)2.在main.cpp文件添加, qmlRegisterType<MouseMemory>("MouseMemory",1,0,"MouseMemory"); #第一个MouseMemory为C......
  • 在项目中用ts封装axios,一次封装整个团队受益
    虽然说FetchAPI已经使用率已经非常的高了,但是在一些老的浏览器还是不支持的,而且axios仍然每周都保持2000多万的下载量,这就说明了axios仍然存在不可撼动的地位,接下来我......
  • Odoo 通过Javascript调用模型中自定义方法
    实践环境Odoo14.0-20221212(CommunityEdition)代码实现在js脚本函数中调用模型中自定义方法:this._rpc({model:'demo.wizard',//模型名称,即模型类定义中_na......
  • vue3+vite | assets动态引入图片的几种方式,解决打包后图片路径错误不显示的问题
    问题vite官方默认的配置,如果资源文件在assets文件夹打包后会把图片名加上hash值,但是直接通过:src="imgSrc"方式引入并不会在打包的时候解析,导致开发环境可以正常引入,打包......
  • 面向对象 定义一个类 手机; 调用这个类 具体化一个小米手机
    1.定义一个类packagecom.fqs.demo1;publicclassPhone{//属性(成员变量)不能给具体的值Stringbrand;doubleprice;//行为(方法)publicv......
  • vue3-router使用
     1.引入routernpminstallvue-router@4 2.创建文件夹router,并创建index.js文件import{createRouter,createWebHashHistory}from"vue-router"constrouter=cr......
  • 1 [初识]Vue3教程简介与Hello World编写 原创
    阅读目录​​前置知识​​​​下载VSCode​​​​编写第一个HelloWorld​​​​直接引入Vue3.x源码​​前置知识但是你还是需要会下面最基本的知识:1、HTML:超文本标记语......
  • Java基础知识点(带返回值方法的定义和调用
    一:带返回值方法的定义方法的返回值其实就是方法运行的最终结果。如果要在调用处根据方法的结果,去编写另外一段逻辑,为了在调用处拿到方法的结果,就需要定义带返回值的方法。eg......