Axios二次封装学习记录(ts)

一.axios介绍

        Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。

二.axios二次封装的目的

减少代码的冗余。减少随着异步接口逐渐增多,而每次去从新写相同的配置(如超时时间、请求头、根据项目环境判断使用哪个请求地址、错误处理等等操作的代码)

二.axios使用

下载axios依赖

npm install axios

代码抽离

1)在src下创建一个/utils/http文件夹并新建一个文件request.ts,引入axios

import axios from "axios";

2)创建一个axios对象,将通用的属性进行设置

export const request = axios.create(
    {
    // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
    // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
    baseURL: url,
    // `method` 是创建请求时使用的方法
    method: 'post', // 默认值
    // `data` 是作为请求体被发送的数据
    // 仅适用 'PUT', 'POST', 'DELETE 和 'PATCH' 请求方法
    // 在没有设置 `transformRequest` 时,则必须是以下类型之一:
    // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
    // - 浏览器专属: FormData, File, Blob
    // - Node 专属: Stream, Buffer
    data: {
    
    },
  
    // `timeout` 指定请求超时的毫秒数。
    // 如果请求时间超过 `timeout` 的值,则请求会被中断
    timeout: 1000, // 默认值是 `0` (永不超时)

    // `withCredentials` 表示跨域请求时是否需要使用凭证
    withCredentials: false, // default

    // `responseType` 表示浏览器将要响应的数据类型
    // 选项包括: 'arraybuffer', 'document', 'json', 'text', 'stream'
    // 浏览器专属:'blob'
    responseType: 'json', // 默认值

    }
)

3)设置拦截器

// 添加请求拦截器
request.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
request.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });

4)request.ts文件

import axios from "axios";



let url=import.meta.env.VITE_APP_URL;

export const request = axios.create(
    {
    // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
    // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
    baseURL: url,
    // `method` 是创建请求时使用的方法
    method: 'post', // 默认值
    // `data` 是作为请求体被发送的数据
    // 仅适用 'PUT', 'POST', 'DELETE 和 'PATCH' 请求方法
    // 在没有设置 `transformRequest` 时,则必须是以下类型之一:
    // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
    // - 浏览器专属: FormData, File, Blob
    // - Node 专属: Stream, Buffer
    data: {
    
    },
  
    // `timeout` 指定请求超时的毫秒数。
    // 如果请求时间超过 `timeout` 的值,则请求会被中断
    timeout: 1000, // 默认值是 `0` (永不超时)

    // `withCredentials` 表示跨域请求时是否需要使用凭证
    withCredentials: false, // default

    // `responseType` 表示浏览器将要响应的数据类型
    // 选项包括: 'arraybuffer', 'document', 'json', 'text', 'stream'
    // 浏览器专属:'blob'
    responseType: 'json', // 默认值

    }
)


// 添加请求拦截器
request.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
request.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });

  export default {request}

调用封装axios

// 使用axios封装接口
import { request } from '@/utils/http/request'

//数据集
const dataSource: Ref<DailyEntry[]> = ref([]);

const initGetList = async () => {

  let d = {
    label: 'Fred',
    type: 'Flintstone'
  };

  request({
    url: '/jz/dailyEntry/query',
    data: d
  }).then(response => {
    dataSource.value = response.data
    console.log('requestAgent.......', response);
  }).catch(function (error) {
    console.log('catch........', error);
  });
}
initGetList()

参考文章

 Axios中文文档 | Axios中文网 (axios-http.cn)

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: axios是一个常用的前端HTTP请求库,它提供了丰富的功能和易用的接口。为了更好地使用和管理axios,我们可以对其进行二次封装,将其与TypeScript结合使用。 首先,我们需要创建一个名为axiosWrapper的文件,用于对axios进行封装。在文件中引入axios,并创建一个axios实例: ```typescript import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; const instance: AxiosInstance = axios.create({ baseURL: 'http://api.example.com', // 接口请求的基础URL timeout: 5000, // 超时时间 }); export default instance; ``` 通过以上代码,我们成功地创建了一个基于axios的实例,并设置了一些全局的请求配置,比如基础URL和超时时间。 接下来,我们可以在项目的其他地方引入axiosWrapper,并进行二次封装,以适应项目的需要。例如,我们可以创建一个名为request的函数,用于发送HTTP请求: ```typescript import axiosWrapper from './axiosWrapper'; export function request<T>(config: AxiosRequestConfig): Promise<T> { return new Promise((resolve, reject) => { axiosWrapper(config) .then((response: AxiosResponse<T>) => { resolve(response.data); }) .catch((error: any) => { reject(error); }); }); } ``` 在以上代码中,我们将axiosWrapper作为基础请求函数,并返回一个Promise对象,以便在其他地方使用async/await进行异步处理。 通过这种二次封装的方式,我们可以在项目中更方便地使用axios,并且可以根据项目的需要进行一些全局配置,比如设置统一的请求头、请求拦截器和响应拦截器等。同时,使用TypeScript还可以增加代码的可读性和可维护性,减少潜在的错误和调试时间。 总之,通过对axios进行二次封装,并结合TypeScript的使用,可以提高代码的可重用性和可扩展性,为项目开发带来便利和效率。 ### 回答2: 在进行axios二次封装时,使用TypeScript (ts) 可以为项目带来更好的类型安全以及代码的可维护性。在开始封装之前,需要先安装axios和typescript依赖。 首先,我们创建一个名为api.ts的文件,作为axios封装的入口文件。在该文件中,我们可以定义一个Axios实例,用来发送网络请求。这个实例可以添加拦截器、设置请求头等。 我们可以使用class来定义这个Axios实例,例如: ```typescript import axios, { AxiosRequestConfig, AxiosInstance } from 'axios'; class Api { private axiosInstance: AxiosInstance; constructor(config: AxiosRequestConfig) { this.axiosInstance = axios.create(config); this.initInterceptors(); } private initInterceptors() { // 添加请求拦截器 this.axiosInstance.interceptors.request.use((config) => { // 在发送请求之前做些什么 return config; }, (error) => { // 对请求错误做些什么 return Promise.reject(error); }); // 添加响应拦截器 this.axiosInstance.interceptors.response.use((response) => { // 对响应数据做些什么 return response; }, (error) => { // 对响应错误做些什么 return Promise.reject(error); }); } // 在这里定义请求的方法 public get(url: string, params?: any) { return this.axiosInstance.get(url, { params }); } public post(url: string, data?: any) { return this.axiosInstance.post(url, data); } // 其他请求方法的定义... } export default Api; ``` 在上述代码中,我们首先引入了axiosAxiosRequestConfig以及AxiosInstance类型。然后创建了一个名为Api的class,用来封装我们的axios请求。 在class的constructor方法中,我们通过axios.create(config)创建了实际的axios实例,并通过initInterceptors()方法初始化了拦截器。 在initInterceptors()方法中,我们使用了axios提供的拦截器,可以在请求发起前做一些操作,以及在响应返回后对响应数据进行处理。 接下来我们可以在Api class中定义我们常用的请求方法,例如get和post方法。可以根据需要,继续封装其他的请求方法。 最后,我们通过export default将Api类导出,供其他地方使用。 通过以上的封装,我们可以在项目中引入Api类,并直接调用其中的方法来发起网络请求。同时,TypeScript的类型检查也能大大提高代码的可维护性和健壮性。 ### 回答3: axios是一种基于Promise的HTTP客户端库,它可以在浏览器和Node.js中发送异步请求。对于在使用TypeScript进行开发的项目中,可以通过二次封装axios来更好地适应项目的需求。 首先,在进行 axios二次封装之前,我们可以为 axios 创建一个实例,并设置一些默认的配置,例如设置基础的URL、headers等。这样可以减少代码的重复性,并保证请求都是在同样的配置下进行的。 其次,通过封装可以统一处理请求和响应的拦截操作。我们可以通过拦截器在请求发送之前和响应之后进行一些处理,例如在请求头添加Token,或者在响应后进行统一的错误处理。这样可以避免在每个请求中都重复写相同的代码,提高代码的复用性和可维护性。 此外,还可以针对项目中的特定需求来进行相应的封装。例如,可以封装处理不同类型请求的方法,如get、post等,或者封装处理不同业务模块的接口方法,如用户、订单等。这样可以更好地组织和管理项目中的请求代码,使其更加清晰和易于维护。 最后,可以使用Typescript对axios进行类型声明的补充,增强代码的可靠性和可读性。通过定义接口或类型来明确请求参数和响应数据的结构,可以避免一些常见的类型错误,并提供更好的代码提示和自动补全。 综上所述,通过对axios进行二次封装,可以根据项目的需求进行灵活的定制和优化,提高代码的复用性、可维护性和可读性,同时结合Typescript的类型声明,使得请求代码更加健壮和可信赖。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值