首页 > 其他分享 >干货分享:Vue 3和TypeScript结合进行API封装

干货分享:Vue 3和TypeScript结合进行API封装

时间:2024-05-28 16:32:56浏览次数:17  
标签:TypeScript 封装 data Vue headers API export config

前言:

    在现代的前端开发中,使用Vue 3和TypeScript结合进行API封装已经成为一种流行的实践。通过将Vue 3的响应式性与TypeScript的静态类型检查相结合,我们可以更加安全和高效地管理和使用接口请求。本文将介绍如何在Vue 3项目中使用TypeScript进行API封装,以提高代码质量、可维护性和可读性。从创建API Service到定义接口类型,从封装请求方法到统一处理错误,本文将逐步引导您实现一个高度可扩展和可维护的API封装方案。让我们一起探索如何利用Vue 3和TypeScript的强大特性,优化前端项目的接口请求管理。

1.介绍

    封装API的主要原因是为了提高代码的可维护性和复用性。通过封装API,可以隐藏实现细节,使得其它模块或应用程序只需关注接口的调用方式,而无需关心具体实现。这样在以后需要修改实现时,只需要修改封装的API,而不会影响到其它代码。

    使用TypeScript的优势包括类型检查和丰富的功能。TypeScript是JavaScript的超集,添加了静态类型系统,可以在编码阶段发现很多潜在的错误。这有助于提高代码的质量和可靠性。此外,TypeScript还提供了模块化、泛型等特性,可以让代码更加清晰易读,并在开发过程中提供更好的工具支持。因此,结合封装API和使用TypeScript可以更好地编写高质量且易维护的代码。

2. 项目准备

  • 确保你的Vue项目已经配置好TypeScript支持。
  • 安装axios网络请求库并引入。
  • 安装qs

3.创建API Service类

    在src内命名一个api 的文件夹,在api文件夹内创建axios.config.ts 、http.ts 、url.ts。

4.定义接口类型

    在axios.config.ts内定义接口类型,使用TypeScript定义接口类型,包括请求参数类型和响应数据类型。

import Axios, { AxiosResponse } from 'axios'
import qs from 'qs'


//这里为后端传递来的接口地址通用前缀
export const baseURL = 'https://'

//例如: https://gmall-prod.atguigu.cn/mall-api/



export const CONTENT_TYPE = 'Content-Type'

export const FILE_CONTENT_TYPE = 'multipart/form-data' //传输文件格式数据

export const FORM_URLENCODED = 'application/x-www-form-urlencoded; charset=UTF-8'

export const APPLICATION_JSON = 'application/json; charset=UTF-8'

export const TEXT_PLAIN = 'text/plain; charset=UTF-8'

const service = Axios.create({
  timeout: 10 * 60 * 1000,
})

service.interceptors.request.use(
  (config) => {
    !config.headers && (config.headers = {})

    if (!config.headers[CONTENT_TYPE]) {
      config.headers[CONTENT_TYPE] = FILE_CONTENT_TYPE
    }

    if (config.headers[CONTENT_TYPE] === FORM_URLENCODED) {
      config.data = qs.stringify(config.data)
    }
    return config
  },
  (error) => {
    return Promise.reject(error.response)
  }
)

service.interceptors.response.use(
  (response: AxiosResponse): AxiosResponse => {
    if (response.status === 200) {
      return response
    } else {
      throw new Error(response.status.toString())
    }
  },
  (error) => {
    if (import.meta.env.MODE === 'development') {
      console.log(error)
    }
    console.log(error.response);

    return Promise.reject({ code: 500, msg: '服务器异常,请稍后重试…' })
  }
)

export default service

5. 封装请求方法 

   在http.ts内封装基本的GET、POST等请求方法,处理请求前后逻辑。

import { AxiosResponse } from 'axios'
import { App } from '@vue/runtime-core'
import request from './axios.config'

export interface HttpOption {
  url: string
  data?: any
  method?: string
  headers?: any
  beforeRequest?: () => void
  afterRequest?: () => void
}

export interface Response<T = any> {
  totalSize: number | 0
  code: number
  msg: string
  data: T
}

function http<T = any>({ url, data, method, headers, beforeRequest, afterRequest }: HttpOption) {
  const successHandler = (res: AxiosResponse<Response<T>>) => {
    if (res.status === 200) {
      return res.data
    }
    throw new Error(res.data.msg || '请求失败,未知异常')
  }
  const failHandler = (error: Response<Error>) => {
    afterRequest && afterRequest()
    throw new Error(error.msg || '请求失败,未知异常')
  }
  beforeRequest && beforeRequest()
  method = method || 'GET'
  const params = Object.assign(typeof data === 'function' ? data() : data || {}, {})
  return method === 'GET'
    ? request.get(url, params,{ headers: headers }).then(successHandler, failHandler)
    : request.post(url, params, { headers: headers }).then(successHandler, failHandler)
}

export function get<T = any>({
  url,
  data,
  method = 'GET',
  headers,
  beforeRequest,
  afterRequest,
}: HttpOption): Promise<Response<T>> {
  return http<T>({
    url,
    method,
    data,
    headers,
    beforeRequest,
    afterRequest,
  })
}

export function post<T = any>({
  url,
  data,
  method = 'POST',
  headers,
  beforeRequest,
  afterRequest,
}: HttpOption): Promise<Response<T>> {
  return http<T>({
    url,
    method,
    data,
    headers,
    beforeRequest,
    afterRequest,
  })
}

function install(app: App): void {
  app.config.globalProperties.$http = http

  app.config.globalProperties.$get = get

  app.config.globalProperties.$post = post
}

export default {
  install,
  get,
  post,
}

declare module '@vue/runtime-core' {
  // 为 `this.$` 提供类型声明
  interface ComponentCustomProperties {
    $get: <T>(options: HttpOption) => Promise<Response<T>>
    $post: <T>(options: HttpOption) => Promise<Response<T>>
  }
}

6.封装调用接口

    在url.ts中对使用的接口进行简单封装,这里简单演示一个登录的接口Login

import { baseURL } from './axios.config'

export const baseAddress1 = baseURL

//baseURL就是axios.config.ts内封装好的 https://gmall-prod.atguigu.cn/mall-api/

export const Login = baseAddress1 + 'login' // 登录接口

//Login的完整地址:https://gmall-prod.atguigu.cn/mall-api/login

declare module '@vue/runtime-core' {
  interface ComponentCustomProperties {
    $urlPath: Record<string, string>
  }
}

7.在Vue组件中使用API Service

    在login.vue中使用上述封装api

<script setup>
import { post, get } from '../../../api/http'
import { Login } from'../../../api/url';


//调用登录接口
function toLogin(){
  post({
    url: Login, // 这里就是封装好的api地址
    data:{
      userid: 666,  //data为接口的各个参数
      key: xxx
    }
  }).then(res =>{
     //res 接口成功返回的数据
  })
}

</script>

结语: 

通过封装API和使用TypeScript,我们可以提高项目的代码质量、可维护性和可读性。封装API可以帮助我们更好地组织接口请求逻辑,降低耦合度,统一管理请求。而使用TypeScript则可以通过静态类型检查和类型推断帮助我们避免潜在的错误,提升代码的稳定性和可靠性。

希望本文能够帮助您更好地理解如何在Vue 3项目中结合API封装和TypeScript优化前端开发流程,提升团队的开发效率和项目的质量。祝您使用愉快!如果有任何问题或建议,请随时与我联系。

标签:TypeScript,封装,data,Vue,headers,API,export,config
From: https://blog.csdn.net/Cy01234/article/details/139241933

相关文章

  • 理解Vue 3响应式系统原理
    title:理解Vue3响应式系统原理date:2024/5/2815:44:47updated:2024/5/2815:44:47categories:前端开发tags:Vue3.xTypeScriptSFC优化Composition-APIRef&Reactive性能提升响应式原理第一章:Vue3简介1.1Vue3概述Vue3的诞生背景:Vue2的局限与改进需......
  • 理解Vue 3响应式系统原理
    https://www.cnblogs.com/Amd794/p/18218208 第一章:Vue3简介1.1Vue3概述Vue3的诞生背景:Vue2的局限与改进需求Vue3的主要版本发布日期和目标:稳定性和性能的提升1.2Vue3的新特性TypeScript支持:引入TypeScript作为官方推荐的开发语言,增强了类型安全性和代码质量......
  • 基于SpringBoot+Vue+uniapp的互助学习的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 基于SpringBoot+Vue+uniapp的考研论坛的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • vue3 动态组件
    <template><divclass="max_box"><a-tabsv-model:activeKey="activeKey"@change="callback"><a-tab-pane:tab="item.tab"v-for="iteminstate.list":key="i......
  • .net core的WebAPI+Vue2实现调用设备拍照上传图片功能
    在工作中有时候会遇到上传文件上传图片或者拍照上传图片功能。这时候底下的内容就有可能可以帮助到你。后端的支持上传图片和上传文件功能。前端如果你选择普通上传功能就是普通上传功能,我这里选择的是调用相机设备实现拍照上传图片功能。1.首先这是后端的控制器接口。1///<......
  • 效率翻倍!超好用的AI+写作API接口汇总
    在过去几年里,人工智能(AI)技术经过众多科技公司和科研人员的不懈努力取得了巨大进步,吸引了大众的广泛关注。这些AI技术在应用领域的新闻报道也逐渐走入人们的视野,引发了对其具体应用的浓厚兴趣。今天,我们将聊一聊AI与写作文案的结合。在传统观念中,AI技术通常被限制在有明确定义任务......
  • java+Angular+Nginx微服务架构+VUE 基于SaaS云部署、云计算的区域医院云HIS系统源码
    java+Angular+Nginx微服务架构+VUE基于SaaS云部署、云计算的区域医院云HIS系统源码HIS系统:可以根据医院规模、个性流程定制个性化程序;以临床工作为核心,方便医生的临床医疗行为,提高医疗服务质量,能提供临床专科数据分析系统,可用于医疗评估、生物医学研究、教育和医疗保健管理......
  • 基于SSM和VUE的五子棋手机网络对战游戏的设计与实现(免费提供全套java开源项目源码+论
    下载地址如下:【免费】基于SSM和VUE的五子棋手机网络对战游戏的设计与实现(免费提供全套java开源项目源码+论文)资源-CSDN文库项目介绍项目背景五子棋是一种古老且流行的棋类游戏,简单易学但变化无穷。随着移动互联网和智能手机的普及,手机端网络对战游戏的需求日益增长。为了满......
  • 滚动条插件vue-scroll
    一、介绍vuescroll是一个基于vue.js2.X虚拟滚动条,它支持定制滚动条的样式,检测内容尺寸变化、能够使内容分页、支持上拉-刷新,下推加载等诸多特性二、特点(1)拥有原生滚动条的滚动行为(2)可以定制滚动条的样式(包括颜色、尺寸、位置、透明度、是否保持显示等)(3)在模式之间自......