【Vue3】Axios简易二次封装+token+跨域问题+接口同步调用使用。

本文详细介绍了在Vue.js项目中如何安装和配置Axios,包括在main.js中设置全局属性、解决跨域问题、封装Axios以及在组件中调用接口。同时,还提供了处理返回数据为Promise的解决方案,帮助开发者更好地理解和实践Vue与Axios的结合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、npm安装axios

npm install axios --save

二、main.js中配置axios

import { createApp } from 'vue'

import axios from 'axios';

import App from './App.vue'

const app = createApp(App)

app.config.globalProperties.$axios = axios

app.mount('#app')

三、解决跨域问题

找到vue.config.js文件

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  devServer:{
    proxy:{
      'api':{
          target:'https://......',  //接口的公共部分 域名+端口号
          pathRewrite:{'^/api':''},
          ws:true,
          changeOrigin:true
      }
    }
  }
})

如果需要多个不同域名接口进行跨域,再进行创建即可。

四、封装Axios

1、首先在src文件夹下创建api文件夹。

        api下创建request.js和index.js

文件名作用
request.js用来封装axios
index.js

用来存放接口文件

2、在request.js文件下进行如下配置

import axios from "axios";   //导入axios
const token = sessionStorage.getItem('token')||'默认的token'   
//token存放在session里 如果没有则执行默认的token

const requests = axios.create({
    baseURL:'/api',    //跨域里配置的api
    timeout:5000        //响应时间
})

//添加请求拦截器
requests.interceptors.request.use(function(config){
    //在发送之前做些什么,例如加入token
    config.headers.Authorization = 'Bearer ' +token   //设置请求头token
    return config;
},function(error){
    //对请求错误做些什么?
    return Promise.reject(error)
})


//添加响应拦截器
requests.interceptors.request.use(function(response){
    //在接受响应时做些什么,例如跳转到登录页
    return response;
},function(error){
    //对响应错误做点什么?
    return Promise.reject(error)
})

export default requests

3、在index.js文件下进行如下配置

import requests from './request'

//以post请求为例
export const saishipost = (data)=>requests({
    url:'/match/user/info',    //直接放地址即可。
    method:'post',
    data
})

4、页面中调用同步接口方式

<script>
import {saishipost} from "@/api/index"   //按需引入里面的接口
export default {
  name: 'App',
  data(){
    return{
      obj:[] //用来接收数据
    }
  },
  methods:{
    async postForm(){            //定义一个方法请求接口
       const re=  await saishipost()      //接口调用的方法
        // console.log(re)
        this.obj = re.data              //赋值
       })
    }
  },
  mounted(){
    this.postForm()                    //调用接口请求
  }
}
</script>

5、解决返回数据是Promise的情况

正常情况下 执行到上面就已经完成了当前页面对接口的调用

如果控制台出现 secondSong:Promise的情况,应该是没有复制,直接return了

return res.data  会出现Promise的情况

所以直接赋值即可。

<think>好的,用户想知道如何在UniApp和Vue3项目中封装Axios的API接口。首先,我需要回忆一下UniApp和Vue3的相关知识。UniApp通常使用uni.request进行网络请求,而Vue3项目则常用Axios。用户可能希望像在Vue使用Axios那样,在UniApp中也能封装类似的请求方法,提高代码复用性和可维护性。 首先,针对UniApp部分。根据引用[1],UniApp的封装需要基于uni.request,可能需要创建一个request.js文件,设置基础URL、拦截器等。需要处理请求前和响应后的逻辑,比如添加token、处理错误信息。然后导出封装后的函数,供其他模块调用。这部分需要参考引用中的步骤,比如创建实例、拦截器、封装get/post方法。 然后是Vue3部分,引用[2]和[3]提到使用Vite和Axios进行封装。需要安装Axios,创建实例,设置拦截器,统一管理API接口。可能需要分层次,比如在api目录下组织各个模块的接口使用async/await或Promise进行处理。同时,要注意错误处理,比如全局捕获错误,提示用户。 用户可能需要具体的示例代码,所以在回答中要提供UniApp和Vue3两部分的代码片段。比如UniApp中的request.js如何封装,如何调用Vue3中如何创建service实例,定义接口函数,并在组件中使用。 同时,用户可能关心最佳实践,比如如何管理不同环境的基础URL,如何处理Token过期,如何统一加载状态提示。需要提到这些点,并给出建议,比如使用环境变量,结合Vuex或Pinia进行状态管理。 还要注意区分UniApp和Vue3的不同点,UniApp没有Axios,所以必须用uni.request,而Vue3可以使用Axios。在UniApp中封装时要模拟Axios的拦截器机制,保持相似的调用方式,方便用户迁移或统一代码风格。 最后,用户可能需要相关问题,比如性能优化、拦截器扩展、处理等,需要生成相关的问题,帮助用户进一步探索。</think>### UniApp中封装请求接口(类似Axios) 在UniApp中需基于`uni.request`进行二次封装,以下是实现步骤: **1. 创建`request.js`基础封装** ```javascript // utils/request.js const BASE_URL = &#39;https://api.example.com&#39; const request = (options) => { return new Promise((resolve, reject) => { uni.request({ url: BASE_URL + options.url, method: options.method || &#39;GET&#39;, data: options.data || {}, header: { &#39;Content-Type&#39;: &#39;application/json&#39;, &#39;Authorization&#39;: uni.getStorageSync(&#39;token&#39;) }, success: (res) => { if (res.statusCode === 200) { resolve(res.data) } else { uni.showToast({ title: &#39;请求异常&#39;, icon: &#39;none&#39; }) reject(res) } }, fail: (err) => { uni.showToast({ title: &#39;网络错误&#39;, icon: &#39;none&#39; }) reject(err) } }) }) } export default request ``` **2. 创建接口管理文件** ```javascript // api/user.js import request from &#39;@/utils/request&#39; export const login = (data) => { return request({ url: &#39;/user/login&#39;, method: &#39;POST&#39;, data }) } ``` **3. 组件调用示例** ```javascript import { login } from &#39;@/api/user&#39; const handleLogin = async () => { try { const res = await login({ username: &#39;admin&#39;, password: &#39;123456&#39; }) console.log(&#39;登录结果:&#39;, res) } catch (e) { console.error(&#39;登录失败:&#39;, e) } } ``` ### Vue3 + Axios封装最佳实践 **1. 创建Axios实例** ```javascript // src/utils/request.js import axios from &#39;axios&#39; const service = axios.create({ baseURL: import.meta.env.VITE_API_URL, timeout: 10000 }) // 请求拦截器 service.interceptors.request.use(config => { config.headers.Authorization = localStorage.getItem(&#39;token&#39;) return config }) // 响应拦截器 service.interceptors.response.use( response => response.data, error => { console.error(&#39;请求错误:&#39;, error) return Promise.reject(error) } ) export default service ``` **2. 接口模块化管理** ```javascript // src/api/auth.js import service from &#39;@/utils/request&#39; export const getProfile = () => service.get(&#39;/user/profile&#39;) export const updateUser = (data) => service.put(&#39;/user&#39;, data) ``` **3. 组件调用方式** ```vue <script setup> import { getProfile } from &#39;@/api/auth&#39; const fetchData = async () => { const userData = await getProfile() console.log(&#39;用户数据:&#39;, userData) } </script> ``` ### 最佳实践建议 1. **环境变量管理**:使用`.env`文件区分开发/生产环境 ```env VITE_API_URL=https://dev.api.com # 开发环境 VITE_API_URL=https://prod.api.com # 生产环境 ``` 2. **类型声明支持**(TypeScript) ```typescript // types/api.d.ts declare interface ResponseData<T> { code: number data: T message: string } ``` 3. **错误处理增强** ```javascript // 在响应拦截器中添加 if (error.response.status === 401) { router.push(&#39;/login&#39;) } ``` 4. **取消请求支持** ```javascript const controller = new AbortController() service.get(&#39;/api&#39;, { signal: controller.signal }) ``` ### 关键差异对比 | 特性 | UniApp封装 | Vue3+Axios封装 | |-------------------|-----------------------|----------------------| | 底层实现 | `uni.request` | `XMLHttpRequest` | | 拦截器机制 | 手动实现 | 内置支持 | | 取消请求 | 需自行实现 | 支持AbortController | | 文件上传 | 需用`uni.uploadFile` | 直接支持 | [^1]: 如何在uniapp中封装request,像Vue Axios一样调用API接口 [^2]: vue3 + vite 进行axios请求封装接口API的统一管理 [^3]: vue3 Axios封装使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值