【vue】promise+axios二次封装请求接口

本文介绍如何在Vue项目中封装Axios库,实现GET和POST请求,并根据不同环境配置接口地址,同时展示了如何在组件中调用封装后的API进行登录操作。

1、ajax.js 封装axios

import axios from 'axios'
import qs from 'qs'

// 请求拦截器和响应拦截器也写在这个文件里,根据需要和项目要求写

export default function ajax(url ,data = {} ,type = 'GET'){
    return new Promise(function(resolve,reject){
        let promise
        if(type === 'GET') {
            let urlStr
            if(data != '{}') {
                urlStr = url + '?' + qs.stringify(data)
            }else {
                urlStr = url
            }
            let token = localStorage.getItem('token')
            promise = axios.get(urlStr,{
                headers:{'apiauth':token}
            })
        }else if (type === 'POST') {
            let token = localStorage.getItem('token')
            promise = axios.post(url,qs.stringify(data),{
                headers:{
                    'Content-Type':'application/x-www-form-urlencoded',
                    'apiauth':token
                }
            })
        }
        promise.then(function(response){
            resolve(response)
        }).catch(function(error){
            reject(error)
        })
    })
}

2、serviceUrl.js开发环境和生产环境的接口地址

let host = ''
if(process.env.NODE_ENV === 'development') {
    // 开发环境
    host = 'localhost:3001'
}else if(process.env.NODE_ENV === 'production') {
    host = 'http://xxxx.com'
}
export {
    host
}

3、api.js 所有的接口请求方法

import ajax from './ajax'
import {host} from './serviceUrl'
// let baseURL = 'localhost:8080'
export const login = ({name,password}) => ajax(`${host}/index/login`,{name,password},'GET')

4、 main.js 挂载在vue原型上

import Vue from 'vue'
import * as Api from './common/api' 
// 由于使用export暴露多个方法,这里要将多个方法引入,使用import * as xxx from xxx    将所有暴露出来的引入成一个对象
Vue.prototype.$api = Api

5、在组件中使用

<script>
export default {
    data () {
        return {
        }
    },
    mounted(){
        this.login()
    },
    methods:{
        async login(){
            let name = 'lisan'
            let password = '123456'
            let res = await this.$api.login({name,password})
            console.log(res)
        }
    }
}
</script>

 

### 创建基于 TypeScript 的 Axios 封装用于 Vue3 请求 为了在 Vue3 项目中利用 TypeScript 对 Axios 进行二次封装来创建请求接口,可以遵循以下方法: #### 安装依赖库 首先,在项目根目录下安装必要的 npm 包: ```bash npm install axios @types/axios vue-router@next --save ``` #### 配置 Axios 实例 接着定义一个通用的 Axios 实例配置文件 `api.ts` 或者 `http.ts`。此实例将被整个应用程序共享。 ```typescript // src/utils/api.ts import axios, { AxiosInstance, AxiosRequestConfig } from 'axios'; const service: AxiosInstance = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000 // request timeout }); service.interceptors.request.use( (config: AxiosRequestConfig) => { const token = localStorage.getItem('token'); if (token && config.headers) { config.headers['Authorization'] = `Bearer ${token}`; } return config; }, error => Promise.reject(error) ); export default service; ``` 上述代码片段展示了如何设置带有默认选项的基础 URL 和超时时间,并添了一个拦截器以自动附认证令牌到每个发出的 HTTP 请求头中[^1]。 #### 构建 API 接口函数 随后可以在单独的服务层模块里声明特定于应用的数据获取方法。这些方法通常返回由 Axios 发起调用的结果承诺对象。 ```typescript // src/services/userService.ts import service from '../utils/api'; import IUserResponse from '@/interfaces/IUserResponse'; class UserService { public async fetchUsers(): Promise<IUserResponse[]> { try { const response = await service.get('/users'); return response.data.users as IUserResponse[]; } catch (error) { throw new Error(`Failed to load users: ${(error as any).message}`); } } } export default new UserService(); ``` 这里假设服务器响应结构包含名为 `users` 的字段列表;同时引入了自定义类型 `IUserResponse` 来描述预期接收到的对象格式。 #### 使用服务类 最后一步是在组件内部注入并使用之前建立的服务实例来进行数据交互操作。 ```typescript // src/components/UserList.vue <script setup lang="ts"> import userService from '@/services/userService'; import type { Ref } from 'vue'; import { onMounted, ref } from 'vue'; let userItems: Ref<Array<any>> = ref([]); onMounted(async () => { try { userItems.value = await userService.fetchUsers(); } catch (err) { console.error(err); } }); </script> <template> <ul v-if="userItems.length !== 0"> <li v-for="(item, index) in userItems" :key="index">{{ item.name }}</li> </ul> <p v-else>No data available.</p> </template> ``` 这段脚本演示了怎样通过组合式API (`setup`) 函数载用户信息,并将其绑定至模板渲染上下文中显示出来。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值