封装axios

配置axios(index.js)


import axios from 'axios'
import { Message, Loading } from 'element-ui'
const ConfigBaseURL = 'http://172.16.3.7:8080' //默认路径,这里也可以使用env来判断环境
let loadingInstance = null //这里是loading
//使用create方法创建axios实例
export const request = axios.create({
    timeout: 7000, // 请求超时时间
    baseURL: ConfigBaseURL,
    method: 'post',
    headers: {
        'Content-Type': 'application/json;charset=UTF-8'
    },
})
// 添加请求拦截器
request.interceptors.request.use(config => {
    loadingInstance = Loading.service({
        lock: true,
        text: 'loading...'
    })
    return config
})
// 添加响应拦截器
request.interceptors.response.use(response => {
    loadingInstance.close()
    // console.log(response)
    return response.data
}, error => {
    console.log('TCL: error', error)
    const msg = error.Message !== undefined ? error.Message : ''
    Message({
        message: '错误' + msg,
        type: 'error',
        duration: 3 * 1000
    })
    loadingInstance.close()
    return Promise.reject(error)
})

封装各个请求(interface.js)

import { request } from "./index.js";


// 音乐咨询信息
export function getMessage(){
    return request({url:'/news',method:'get'})
}


// 收藏者信息
export function getCollect() {
    return request({
        url: '/collector',
        method:'get'
    })
}


// 获取评论信息
export function getComment() {
    return request({
        url: '/comment',
        method: 'get'
    })
}

// 发送评论
export function sentComment(data) {
    return request({
        url: '',
        data:JSON.stringify(data)
    })
}

// 获取每日推荐歌单
export function getRecoment() {
    return request({
        url: ''
    })
}

// 获取收藏歌单
export function getLikeSong() {
    return request({
        url: ''
    })
}

// 获取最近歌单
export function getCurSong() {
    return request({
        url: ''
    })
}

// 登录
export function login(data){
    return request({
        url:'/login',
        method: 'get',
        params:data
    })
}

组件中使用

import { getMessage } from "../../network/interface";
getMessage().then((res) => {
        console.log(res); 
      });
<think>首先,用户的问题是关于在 TypeScript 中封装 Axios 实例和请求拦截器。用户引用了两个参考内容,这些内容是关于封装 Axios 以满足功能如代码提示、拦截器、多个实例、配置请求头和超时时间、取消请求等。 用户意图:用户想了解如何在 TypeScript 中封装 Axios,特别是创建实例和设置请求拦截器。 系统级指令: - 所有行内数学表达式必须使用$...$格式。但在这个问题中,可能没有数学表达式,所以我不需要强制添加。 - 独立公式使用$$...$$,但同样,这里可能不适用。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 参考引用: - 引用[1]:关于封装Axios,满足代码提示、拦截器、多个实例、配置、取消请求。 - 引用[2]:安装axios和@types/axios。 我的回答需要基于这些引用,并扩展以覆盖用户的问题:封装Axios实例和请求拦截器。 回答结构: 1. **引言**:简要介绍封装Axios的好处。 2. **步骤**:逐步解释如何在TypeScript中封装Axios。 - 安装依赖。 - 创建基础封装类或函数。 - 设置请求拦截器。 - 创建多个实例。 - 添加配置选项如请求头、超时。 - 实现取消请求功能。 3. **代码示例**:提供TypeScript代码示例。 4. **总结**:强调关键点。 5. **相关问题**:生成相关问题。 确保回答真实可靠:基于Axios官方文档和TypeScript最佳实践。 现在,规划内容: - **安装依赖**:参考引用[2],安装axios和@types/axios。 - **基础封装**:参考引用[1],创建一个类来封装Axios实例。 - **请求拦截器**:在封装中添加拦截器。 - **多个实例**:展示如何创建不同配置的实例。 - **取消请求**:简要介绍如何实现。 代码示例:使用TypeScript编写一个封装类。 最终,添加相关问题。 回答语言:中文。</think>### 在 TypeScript 中封装 Axios 实例和请求拦截器 在 TypeScript 项目中封装 Axios 可以提升代码的可维护性、类型安全性和灵活性。封装的核心目标是实现代码提示、灵活的拦截器、多实例支持、自定义配置(如请求头和超时时间)以及取消请求功能[^1]。以下我将逐步解释如何实现,包括创建 Axios 实例和设置请求拦截器。所有步骤基于 Axios 官方文档和 TypeScript 最佳实践,确保真实可靠。 #### 步骤 1: 安装依赖 首先,安装 Axios 及其 TypeScript 类型定义文件。使用 npm、yarn 或 pnpm 命令(参考引用[2]): ```bash pnpm install axios @types/axios # 或 npm install axios @types/axios ``` 这一步确保在 TypeScript 中获得完整的类型提示。 #### 步骤 2: 创建基础封装类 创建一个 `AxiosService` 类来封装 Axios 的核心功能。这个类支持创建多个实例,每个实例可独立配置请求头、超时时间等。 ```typescript import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; class AxiosService { // 私有实例属性,用于存储当前 Axios 实例 private instance: AxiosInstance; constructor(config?: AxiosRequestConfig) { // 创建 Axios 实例,传入自定义配置 this.instance = axios.create(config || {}); // 初始化请求拦截器(详见步骤 3) this.setupInterceptors(); } // 获取当前实例的方法 public getInstance(): AxiosInstance { return this.instance; } // 设置请求拦截器(下一步实现) private setupInterceptors(): void { // 将在步骤 3 填充 } } // 示例:创建默认实例 const defaultAxios = new AxiosService(); export default defaultAxios; ``` 此代码定义了一个类,通过构造函数传入配置对象(如 `baseURL`、`timeout`)来创建实例。支持多个实例(例如,为不同 API 端点创建不同实例),灵活性高[^1]。 #### 步骤 3: 添加请求拦截器 请求拦截器用于在发送请求前修改配置(如添加 token 或日志)。在 `setupInterceptors` 方法中实现: ```typescript private setupInterceptors(): void { // 请求拦截器:在请求发送前处理 this.instance.interceptors.request.use( (config: AxiosRequestConfig) => { // 示例:添加认证 token 到请求头 const token = localStorage.getItem('token'); if (token) { config.headers = config.headers || {}; config.headers.Authorization = `Bearer ${token}`; } console.log('请求发送:', config.url); // 可选:日志记录 return config; // 返回修改后的配置 }, (error) => { // 请求错误处理 console.error('请求拦截器错误:', error); return Promise.reject(error); } ); // 响应拦截器(可选):在响应返回后处理 this.instance.interceptors.response.use( (response: AxiosResponse) => { console.log('响应接收:', response.status); return response; // 直接返回响应 }, (error) => { console.error('响应错误:', error); return Promise.reject(error); } ); } ``` - **请求拦截器**:修改请求配置(如添加 headers)。 - **响应拦截器**:处理响应或错误(如统一错误处理)。 拦截器提供灵活性,适用于认证、日志、错误处理等场景[^1]。 #### 步骤 4: 支持自定义配置和取消请求 扩展类以支持更多功能: - **自定义配置**:在创建实例时传入参数。 - **取消请求**:使用 Axios 的 `CancelToken` 实现。 ```typescript // 在 AxiosService 类中添加方法 public request<T>(config: AxiosRequestConfig): Promise<AxiosResponse<T>> { return this.instance.request<T>(config); } // 取消请求功能 public cancelRequest(message?: string): void { // 示例:取消所有请求(实际项目中可扩展为按 URL 取消) const source = axios.CancelToken.source(); source.cancel(message || '请求已取消'); // 可存储 source 到数组,实现细粒度取消 } // 示例:创建带自定义配置的实例 const apiInstance = new AxiosService({ baseURL: 'https://api.example.com', timeout: 5000, // 超时时间 5 秒 headers: { 'Content-Type': 'application/json' } }); ``` - 通过 `request` 方法封装请求调用,确保类型提示(如 `T` 泛型用于响应数据类型)。 - 取消请求功能可扩展为按 URL 取消单个请求或批量取消[^1]。 #### 完整代码示例 整合以上步骤,创建一个可复用的封装: ```typescript import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, CancelTokenSource } from 'axios'; class AxiosService { private instance: AxiosInstance; private cancelSources: CancelTokenSource[] = []; // 存储取消令牌 constructor(config?: AxiosRequestConfig) { this.instance = axios.create(config || {}); this.setupInterceptors(); } private setupInterceptors(): void { this.instance.interceptors.request.use( (config) => { // 添加认证 token const token = localStorage.getItem('token'); if (token) { config.headers = { ...config.headers, Authorization: `Bearer ${token}` }; } return config; }, (error) => Promise.reject(error) ); this.instance.interceptors.response.use( (response) => response, (error) => { if (axios.isCancel(error)) { console.log('请求取消:', error.message); } else { console.error('响应错误:', error); } return Promise.reject(error); } ); } public getInstance(): AxiosInstance { return this.instance; } public request<T>(config: AxiosRequestConfig): Promise<AxiosResponse<T>> { const source = axios.CancelToken.source(); this.cancelSources.push(source); return this.instance.request<T>({ ...config, cancelToken: source.token }); } public cancelAllRequests(message?: string): void { this.cancelSources.forEach(source => source.cancel(message || '请求已取消')); this.cancelSources = []; } } // 导出实例 export const defaultAxios = new AxiosService(); export const apiAxios = new AxiosService({ baseURL: 'https://api.example.com' }); ``` - **使用示例**: ```typescript // 发起请求 defaultAxios.request<{ data: string }>({ url: '/user', method: 'GET' }).then(response => { console.log(response.data); }); // 取消所有请求 defaultAxios.cancelAllRequests(); ``` 此封装满足代码提示(TypeScript 泛型)、拦截器、多实例、配置自定义和取消请求需求[^1]。 ### 总结 在 TypeScript 中封装 Axios 的关键是: 1. **使用类封装**:支持多实例和独立配置。 2. **拦截器处理**:请求拦截器用于修改配置,响应拦截器用于统一错误处理。 3. **类型安全**:通过泛型(如 `request<T>`)确保响应数据类型提示。 4. **取消请求**:基于 `CancelToken` 实现可扩展的取消逻辑。 这种方法提升了代码复用性和可维护性,适用于大型项目[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值