Axios初步使用以及ts二次封装

Axios介绍

简介

Axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js中。它具有简洁、高效、易用的特点,可以帮助我们更好地发起HTTP请求。Axios支持浏览器和Node.js两种环境,并且可以拦截请求和响应、自定义请求头、转换请求数据和响应数据等功能。Axios的特点包括:

  • 支持浏览器和Node.js。
  • 基于Promise的API。
  • 支持请求和响应的拦截。
  • 支持请求和响应的转换。
  • 自动转换JSON数据。
  • 可以取消请求。
  • 安全、简单、高效、易用。

安装

使用npm安装Axios:

bash 复制代码
npm install axios

使用yarn安装Axios:

bash 复制代码
yarn add axios

使用方法

发起GET请求

发起一个简单的GET请求:

javascript 复制代码
import axios from 'axios';

axios.get('/user?id=12345')
  // 处理成功情况
  .then(response => {
    console.log(response);
  })
  // 处理错误情况
  .catch(error => {
    console.log(error);
  });

使用async/await语法:

javascript 复制代码
import axios from 'axios';

async function getUser() {
  try {
    const response = await axios.get('/user?id=12345');
    console.log(response);
  } catch (error) {
    console.log(error);
  }
}

发起POST请求

发起一个简单的POST请求:

javascript 复制代码
import axios from 'axios';

axios.post('/user', {
    firstName: 'John',
    lastName: 'Doe'
  })
  .then(response => {
    console.log(response);
  })
  .catch(error => {
    console.log(error);
  });

使用async/await语法:

javascript 复制代码
import axios from 'axios';

async function createUser() {
  try {
    const response = await axios.post('/user', {
      firstName: 'John',
      lastName: 'Doe'
    });
    console.log(response);
  } catch (error) {
    console.log(error);
  }
}

自定义配置

我们可以通过传递一个配置对象来自定义Axios的配置:

javascript 复制代码
import axios from 'axios';

const instance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

instance.get('/user?id=12345')
  .then(response => {
    console.log(response);
  })
  .catch(error => {
    console.log(error);
  });

错误处理

Axios可以帮助我们处理错误。例如,在发起一个请求时,如果发生错误,我们可以在.catch()块中进行处理:

javascript 复制代码
import axios from 'axios';

axios.get('/user?id=12345')
  .then(response => {
    console.log(response);
  })
  .catch(error => {
    if (error.response) {
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    } else if (error.request) {
      console.log(error.request);
    } else {
      console.log('Error', error.message);
    }
  });

二次封装

为什么要二次封装

Axios本身已经是一个强大的HTTP客户端库,为什么还需要进行二次封装呢?这主要涉及到项目的具体需求和开发的最佳实践,以下是一些常见的原因:

  1. 简化请求的配置: 在项目中,可能存在一些公共的配置,如baseURL、请求头、拦截器等。通过二次封装,可以将这些公共的配置提取到封装的类或函数中,从而简化每次请求时的配置。
  2. 统一处理请求和响应: 通过二次封装,可以在请求发送前和响应返回后添加拦截器,用于处理一些全局的逻辑,例如加载提示、错误处理、认证等。这有助于提高代码的一致性,减少重复代码。
  3. 提高可维护性: 二次封装可以将项目中的HTTP请求逻辑集中在一个地方,使得代码更加模块化和可维护。如果需要修改HTTP请求的一些行为,只需要修改封装的地方,而不必在整个项目中寻找和修改每个具体的请求。
  4. 处理特定业务逻辑: 在一些特定的业务场景中,可能需要对请求或响应做一些特殊的处理,例如数据格式转换、错误处理等。通过二次封装,可以在封装层面处理这些业务逻辑,使得业务代码更加清晰。
  5. 方便切换底层实现: 如果未来需要切换底层的HTTP库,例如从Axios切换到Fetch或其他库,通过二次封装,只需要修改封装层的实现,而不必修改整个项目中的每个请求。

总的来说,二次封装Axios有助于提高代码的可维护性、可读性和一致性,同时可以在项目中加入一些通用的处理逻辑,使得开发更加高效。然而,封装的深度和复杂度应该根据具体项目的规模和需求进行权衡。

typescript二次封装

typescript 复制代码
import axios, {
  AxiosInstance,
  AxiosRequestConfig
} from "axios"

export class Http {
  instance: AxiosInstance
  constructor(baseURL: string) {
    this.instance = axios.create({
      baseURL
    })
  }
  get < R = unknown > (url: string, query ? : Record < string, string > , config ? : Omit < AxiosRequestConfig, 'params' | 'url' | 'method' > ) {
    return this.instance.request < R > ({
      ...config
      url: url,
      params: query,
      method: 'get'
    })
  }
  post < R = unknown > (url: string, query ? : Record < string, JSONValue > , config ? : Omit < AxiosRequestConfig, 'params' | 'url' | 'method' > ) {
    return this.instance.request < R > ({
      ...config
      url: url,
      params: query,
      method: 'post'
    })
  }
  patch < R = unknown > (url: string, query ? : Record < string, string > , config ? : Omit < AxiosRequestConfig, 'params' | 'url' | 'method' > ) {
    return this.instance.request < R > ({
      ...config
      url: url,
      params: query,
      method: 'patch'
    })
  }
  delete < R = unknown > (url: string, query ? : Record < string, string > , config ? : Omit < AxiosRequestConfig, 'params' | 'url' | 'method' > ) {
    return this.instance.request < R > ({
      ...config
      url: url,
      params: query,
      method: 'delete'
    })
  }
}

export const http = new Http('/api/v1')

知识点总结

隔离对axios的依赖,如果换了别的库可以直接把instance换成其他方法

config: Omit < AxiosRequestConfig, 'params' | 'url' | 'method'>>

防止用户写代码的时候传入了params | url | method

Omit的使用

Omit的两个参数,从A参数中删除B参数字段 官方链接

接受返回值的泛型

使用时const result = await get<>('/api/v1/users')result不知道是什么类型,所以要接受一个泛型给它
request默认接受一个T,T会变成AxiosResponse的参数 Axios默认接受一个对data的描述

发了请求不想知道请求是什么类型就默认使用unknown

typescript 复制代码
get < R = unknown > () { 
  return this.instance.request < R >
}

使用代码

typescript 复制代码
const validationCode = async () => {
  const response = await http.post(url,query,config)
    .catch(()=>{
        //失败后执行的代码
    })
}
相关推荐
excel17 小时前
JavaScript 中 substr、substring 和 slice 的区别
前端
范同学~17 小时前
固定表头+第一列+最后一列
java·服务器·前端
zttbee18 小时前
npm install卡顿
前端·npm·node.js
Amos_Web18 小时前
Rspack 源码解析(二十七):AsyncWasmParserAndGenerator 如何把二进制变成异步模块
前端·rust
西红柿炖牛腩35418 小时前
机房电脑不能联网,怎么离线把课件里的 3D 模型压小?Draco / Meshopt 参数清单
前端·javascript·3d·性能优化·大屏端
爱喝水的小周18 小时前
实验十三 Vue 过渡与动画—电商后台消息中心实现
前端·javascript·vue.js
hunterandroid18 小时前
Navigation Component 工程落地:从单 Activity 架构到深度链接配置
android·前端
无责任此方_修行中18 小时前
如何不用括号调用 JS 的函数?
前端·javascript·node.js
kyriewen18 小时前
我数了 647 条大厂前端 JD:AI 不再只是加分项
前端·程序员·ai编程
无责任此方_修行中18 小时前
Deno 的八年:一场没逃出 Node 引力的运行时起义
前端·javascript·node.js