基于Typescript与Axios的接口请求管理详解

目录
  • 思路
  • 请求拦截
  • 响应拦截
  • 使用httpClient.ts定义请求
  • 在组件中请求接口
  • 总结

本文主要介绍基于TS和AXIOS的接口请求封装

思路

请求拦截

  • 在请求头添加一些参数,例如token,uid等
  • 判断用户登录状态,如果没有登录,直接跳转登录
  • 处理请求数据转换发送请求的数据格式,json→urlencoded (可选的)

响应拦截

  • 判断后端响应的业务状态码,进行不同的处理

    • 例如用户登录状态过期,直接跳转登录
    • 统一的报错提示

先把套路化的代码写出来:

import axios, {
    AxiosInstance,
    AxiosResponse,
    AxiosRequestConfig,
    AxiosError
} from 'axios'
export default abstract class HttpClient {
    protected readonly instance: AxiosInstance

    public constructor(baseURL = '/api', timeout = 1000 * 120) {
        this.instance = axios.create({
            baseURL,
            timeout
        })
        // 1. 请求拦截器
        this._initializeRequestInterceptor()
        // 2. 响应拦截器
        this._initializeResponseInterceptor()
    }
    private _initializeRequestInterceptor = () => {
        this.instance.interceptors.request.use(
            this._handleRequest,
            this._handleError
        )
    }
    private _handleRequest = (config: AxiosRequestConfig) => {}

    private _initializeResponseInterceptor = () => {
        this.instance.interceptors.response.use(
            this._handleResponse,
            this._handleError
        )
    }
    private _handleResponse = (response: AxiosResponse) => {}
    protected _handleError = (error: AxiosError) => Promise.reject(error)
}

简单说一下上面的代码,我们创建了一个用于请求接口的HttpClient类,在constructor中定义了baseURL和超时时间timeout,同时定义了请求拦截方法和响应拦截方法。

至此,发起一个接口的流程如下:

  1. 发送请求之前,调用请求拦截
  2. 发送接口,network出现请求
  3. 接口响应,调用响应拦截
  4. 响应给前端程序,执行对应的逻辑

请求拦截

下面开始详细的逻辑,请求拦截的时候,可以做的事情如下:

  1. 在请求头添加一些参数,例如token,uid等
  2. 判断用户登录状态,如果没有登录,直接跳转登录
  3. 处理请求数据转换发送请求的数据格式,json→urlencoded (可选的)
     private _handleRequest = (config: AxiosRequestConfig) => {
        //1. 添加自定义请求头
        config.headers['Authorization'] = 'my token'
        config.headers['mobile'] = 'my mobile'
        //2. 判断是否登录(判断是否有toke)

        //3. 转化数据格式
        config.data = qs.stringify(config.data)
        return config
    }

响应拦截

得到了响应之后,处理如下:

  • 判断后端响应的业务状态码,进行不同的处理

    • 如果用户登录状态过期,直接跳转登录
    • 统一的报错提示
  • 保存token
 // 响应拦截器
    private _handleResponse = (response: AxiosResponse) => {
        const { data, headers } = response

        //1.--处理响应的token,保存token
        const token = headers['authorization']
        if (token) {
            this._saveToken(token)
        }

        //2. --处理响应码,这里try-catch一下,如果后端有的接口没有返回code,直接返回
        try {
            const code = data.code,
            message = data.desc || data.msg
            const isSucceed = this._handleResCode(code, message, url)
            if (isSucceed) {
                return Promise.resolve(data)
            } else {
                return Promise.reject(message)
            }
        } catch (error) {
            return Promise.resolve(data)
        }

    }
    //保存token
    private _saveToken(token: string) {
        const USER = getModule(UserModule)
        USER.setToken(token)
    }
    private _handleResCode(code: number, message: string, url: string) {
        if (code === 0) {
            // 请求成功
            return true
        } else if (code===4000) {
            // token失效,跳回登录界面
            Vue.prototype.$message.error('身份信息过期,请重新登陆')
            router.push({ name: 'login' })
            return false
        } else {
            // 其他情况,统统提示message信息
            Vue.prototype.$message.error(message)
            return false
        }
    }

使用httpClient.ts定义请求

建议请求相关的文件定义在@/api目录下面,目录如下

httpClient.ts
user.ts
uti.ts

在对应的文件中定义请求,注意事项

  1. 所有请求类需要继承HttpClient类,HttpClient做了一些统一拦截统一处理请求及响应的工作
  2. 请求响应的数据需要提供类型,类型定义在@/types/xxx文件中,一个模块对应一个文件。只有提供了类型,才会有代码提示
import HttpClient from './HttpClient'
import { AlarmItemType } from '../types/test'
import { BaseResType } from '../types/index'

class UtilApi extends HttpClient {
   //例如后台返回的响应  res={code:xxx,data:xxx,token:xxx,desc:xxx}
    //首先需要定义 res.data 的类型 即get的第一个参数  AlarmItemType
    //然后需要定义整个响应的类型 即 BaseResType<AlarmItemType>
    public getAlarmById = (id: string) =>
        this.instance.get<AlarmItemType, BaseResType<AlarmItemType>>(
            `/realtime/alarms/queryByAlarmId/${id}`
        )
}

export const UTIL_API = new UtilApi()

在组件中请求接口

在需要发送请求的组件中键入请求模块的关键字,例如USER_API,如果安装了插件TypeScript Importer,就会有相应的模块导入提示,此时输入回车即可导入相应的模块。

<template>
    <section>请求数据:{{ alarmData }}</section>
</template>

<script lang="ts">
import { UTIL_API } from '@/api/utilApi'
import { Vue, Component } from 'vue-property-decorator'
@Component({
    components: {}
})
export default class TestRequest extends Vue {
    alarmData = {}
    async getAlarmData() {
        const res = await UTIL_API.getAlarmById('alarmIdc7e9bd47')
        if (res.code == 0) {
            this.$message.success('请求成功')
            this.alarmData = res.data
        }
    }
    mounted() {
        this.getAlarmData()
    }
}
</script>
<style lang="scss" scoped></style>

总结

到此这篇基于Typescript与Axios的接口请求管理的文章就介绍到这了,更多相关Typescript与Axios接口请求内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • TypeScript 中接口详解

    在 TypeScript 中,接口是用作约束作用的,在编译成 JavaScript 的时候,所有的接口都会被擦除掉,因为 JavaScript 中并没有接口这一概念. 先看看一个简单的例子: function printLabel(labelledObj: { label: string }) { console.log(labelledObj.label); } var myObj = { size: 10, label: "Size 10 Object" }; printLabel

  • TypeScript入门-接口

    大致介绍 在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约. 接口 例子: function printLabel(labelledObj: { label: string }) { console.log(labelledObj.label); } let myObj = { size: 10, label: "Size 10 Object" }; printLabel(myObj); printLabel函数有一个参数,要求这个参数是个对象,并

  • TypeScript定义接口(interface)案例教程

    接口的作用: 接口,英文:interface,其作用可以简单的理解为:为我们的代码提供一种约定. 在Typescript中是这么描述的: TypeScript的核心原则之一是对值所具有的结构进行类型检查.它有时被称做"鸭式辨型法"或"结构性子类型化". 在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约. 举个例子: // 定义接口 Person interface Person { name: string; age: numb

  • TypeScript接口介绍

    目录 1.接口的定义 2.属性 2.1可选属性 2.2只读属性 3.类类型 3.1继承接口 4.函数类型 前言: TS的核心原则之一就是对所具有的结构 进行类型检查.接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约. 最终被编译成JavaScript代码后不包含接口以及类型约束的代码. 1.接口的定义 接口的作用于type关键字类似,但是又不一样.type可以定义简单的数据类型,例如如下代码 type str = string 这种写法就不能应用在 接口 中,接口中只能写函数类型和类

  • 基于Typescript与Axios的接口请求管理详解

    目录 思路 请求拦截 响应拦截 使用httpClient.ts定义请求 在组件中请求接口 总结 本文主要介绍基于TS和AXIOS的接口请求封装 思路 请求拦截 在请求头添加一些参数,例如token,uid等 判断用户登录状态,如果没有登录,直接跳转登录 处理请求数据转换发送请求的数据格式,json→urlencoded (可选的) 响应拦截 判断后端响应的业务状态码,进行不同的处理 例如用户登录状态过期,直接跳转登录 统一的报错提示 先把套路化的代码写出来: import axios, { Ax

  • vue中Axios的封装与API接口的管理详解

    如图,面对一团糟代码的你~~~真的想说,What F~U~C~K!!! 回归正题,我们所要的说的axios的封装和api接口的统一管理,其实主要目的就是在帮助我们简化代码和利于后期的更新维护. 一.axios的封装 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中.他有很多优秀的特性,例如拦截请求和响应.取消请求.转换json.客户端防御XSRF等.所以我们的尤大大也是果断放弃了对其官方库vue-reso

  • React项目中axios的封装与API接口的管理详解

    目录 前言 安装 引入 环境的切换 请求拦截 响应拦截 api的统一管理 总结 前言 在react项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中.他有很多优秀的特性,例如拦截请求和响应.取消请求.转换json.客户端防御XSRF等.如果还对axios不了解的,可以移步axios文档. 安装 //使用npm安装 npm install axios; //使用yarn安装 yarn add axios 引入 在项目

  • Vue3+TypeScript封装axios并进行请求调用的实现

    不是吧,不是吧,原来真的有人都2021年了,连TypeScript都没听说过吧?在项目中使用TypeScript虽然短期内会增加一些开发成本,但是对于其需要长期维护的项目,TypeScript能够减少其维护成本,使用TypeScript增加了代码的可读性和可维护性,且拥有较为活跃的社区,当居为大前端的趋势所在,那就开始淦起来吧~ 使用TypeScript封装基础axios库 代码如下: // http.ts import axios, { AxiosRequestConfig, AxiosRes

  • SpringCloud微服务开发基于RocketMQ实现分布式事务管理详解

    目录 消息队列实现分布式事务原理 RocketMQ的事务消息 代码实现 基础配置 发送半消息 执行本地事务与回查 Account-Service消费消息 测试 小结 消息队列实现分布式事务原理 首先让我们来看一下基于消息队列实现分布式事务的原理方案. 柔性事务 发送消息的服务有个OUTBOX数据表,在进行INSERT.UPDATE.DELETE 业务操作时也会给OUTBOX数据表INSERT一条消息记录,这样可以保证原子性,因为这是基于本地的ACID事务. OUTBOX表充当临时消息队列,然后我

  • 基于form-data请求格式详解

    最近一直都比较忙,坚持月月更新博客的计划不得中止了,今天抽出点时间来说说最近项目中遇到的一个问题,有关request post请求格式中的multipart/form-data格式. 引言 最近在参与一个项目过程中遇到一个问题,相信大部分人都遇到过: 在后端与前端约定好application/json格式传递数据时,因为后台是go强类型语言,在定义api接口时,某些字段要求是整型类型,但是对于前端来说输入框或者从url中的search取到的参数都是字符串,不得不进行前端类型转换. 咋一看,对于接

  • 基于React Hooks的小型状态管理详解

    目录 实现基于 React Hooks 的状态共享 使用感受 本文主要介绍一种基于 React Hooks 的状态共享方案,介绍其实现,并总结一下使用感受,目的是在状态管理方面提供多一种选择方式. 实现基于 React Hooks 的状态共享 React 组件间的状态共享,是一个老生常谈的问题,也有很多解决方案,例如 Redux.MobX 等.这些方案很专业,也经历了时间的考验,但私以为他们不太适合一些不算复杂的项目,反而会引入一些额外的复杂度. 实际上很多时候,我不想定义 mutation 和

  • Golang基于JWT与Casbin身份验证授权实例详解

    目录 JWT Header Payload Signature JWT的优势 JWT的使用场景 Casbin Casbin可以做什么 Casbin不可以做什么 Casbin的工作原理 实践 登录接口请求 Token实现 使用Redis存储Token信息 用Casbin做授权管理 实现Casbin的策略 创建Todo JWT JSON Web Toekn(JWT)是一个开放标准RFC 7519,以JSON的方式进行通信,是目前最流行的一种身份验证方式之一. eyJhbGciOiJIUzI1NiIs

  • 基于MyBatis的数据持久化框架的使用详解

    目录 一.MyBatis是什么 1.1.概述 1.2.什么是持久化 1.3.什么是ORM 1.4.MyBatis主要内容 1.5.优点 1.6.缺点 二.MyBatis架构 2.1.mybatis所依赖的jar包 2.2.MyBatis准备工作 三.MyBatis 核心对象 一.MyBatis是什么 1.1.概述 Mybatis是一个优秀的开源.轻量级持久层框架,它对JDBC操作数据库的过程进行封装,简化了加载驱动.创建连接.创建 statement 等繁杂的过程,使开发者只需要关注sql本身.

  • vue3 axios 实现自动化api配置详解

    目录 概述 示例 约定 请求 URL 的约定 请求传参的约定 分页列表,请求参数约定 分页列表 响应示例 响应码 code 的约定 请求跨域问题解决方案 全局配置 配置说明coder/config.js 模型配置 1.实现对一个实体进行增.删.改.查.导出.唯一性校验 2.只需要增.删.改.查中得某些操作,可以指定生成你需要的方法 3.自定义方法配置 4.指定请求接口地址前缀 概述 在实践中,我们发现上述的代码重复率非常高,新增和修改都费力,并且是没技术含量的体力活. 但又必须要这样做,不适合以

随机推荐