本案例旨在教授如何使用Axios库结合TypeScript泛型进行HTTP请求的高级封装,以提升代码的可复用性和类型安全性。我们将通过一个具体的示例,学习如何创建一个通用的请求函数,它能够适应不同类型的API响应,并在请求前后加入自定义逻辑(如错误处理、Token注入等)。
- import axios, { type AxiosResponse } from 'axios';
- import type { AxiosInstance, AxiosRequestConfig } from 'axios';
- const axiosInstance: AxiosInstance = axios.create({
- baseURL: 'https://tenapi.cn/v2/',
- timeout: 10000
- });
- axiosInstance.interceptors.request.use(config => {
- // 可以在此处添加Token或其他请求头
- return config;
- }, error => Promise.reject(error));
-
- axiosInstance.interceptors.response.use(res => res, error => Promise.reject(error));
- export interface ApiResponse
any> { - code: number;
- msg: string;
- timestamp: number;
- data: T;
- }
- export async function request
(config: AxiosRequestConfig): Promise { - return axiosInstance.request<ApiResponse
>(config).then(res => res.data); - }
- interface Hot {
- name: string;
- url: string;
- hot: number;
- }
-
- request<Array<Hot>>({
- url: '/baiduhot',
- method: 'get'
- }).then(res => {
- if(res.code === 200) {
- const hot = res.data[0];
- console.log(hot.name);
- }
- });
- import axios, {type AxiosResponse} from 'axios';
- import type { AxiosInstance, AxiosRequestConfig } from 'axios';
-
- /* 创建axios实例 */
- const axiosInstance : AxiosInstance = axios.create({
- baseURL: 'https://tenapi.cn/v2/',
- timeout: 10000
- });
-
-
- /* 封装实例的请求拦截器 */
- axiosInstance.interceptors.request.use( config => {
- return config;
- }, (error) => {
- return Promise.reject(error);
- });
-
-
- /* 封装实例的响应拦截器 */
- axiosInstance.interceptors.response.use( (res : AxiosResponse<any>) => {
- return res;
- }, (error) => {
- return Promise.reject(error);
- });
-
-
- /* 定义接口 */
- export interface ApiResponse
{ - code: number;
- msg: string;
- timestamp: number;
- data: T;
- }
-
-
-
- /* 封装实例的请求方法 */
- export async function request
(config: AxiosRequestConfig ) { - // axios实例的 request 接受的第一个泛型参数,就是返回数据data的类型
- return axiosInstance.request<ApiResponse
>(config).then((res) => res.data); - }
-
-
- /* 如何使用代码如下 */
- interface Hot {
- name: string;
- url: string;
- hot: number;
- }
-
- request<Array<Hot>>({
- url: '/baiduhot',
- method: 'get'
- }).then(res => {
- if(res.code == 200) {
- let hot = res.data[0];
- console.log(hot.name);
- }
- });