Axios的实用简易封装

前言

axios 是目前最优秀的 HTTP 请求库之一,虽然 axios 已经封装的非常好了,我们可以直接拿过来用。但是在实际的项目中,我们可能还需要对 axios 在封装一下,以便我们更好的管理项目和各个接口,本篇文章是一个简易的Axios封装,方便朋友们上手。

1.封装的目的

此次进行简单的封装,所以暂时没有考虑取消重复请求、重复发送请求、请求缓存等情况!这里主要实现以下目的:

  1. 实现请求拦截
  2. 实现响应拦截
  3. 常见错误信息处理
  4. 请求头设置
  5. api 集中式管理

2.初始化 axios实例

虽然 axios 可以调用 get、post 等方法发起请求,但是我们为了更好的全局控制所有请求的相关配置,所以我们使用 axios.create()创建实例的方法来进行相关配置,这也是封装 axios 的精髓所在。

示例代码:

const http = axios.create({
    // 设置请求接口数据的基准地址,后面请求的时候只需要加请求路径
    baseURL: 'http://127.0.0.1:8888/api/private/v1/',
    // 设置超时时间
    timeout: 5000,
    withCredentials: false
})

 通过 create 方法我们得到了一个 axios 的实例,该实例上有很多方法,比如拦截器等等。我们创建实例的时候可以配置一些基础设置,比如基础请求地址,请求超时等等。

3.设置请求拦截

我们在发送请求的时候可能需要携带一些信息在请求头上,比如 token 等,所以说我们就需要将请求拦截下来,处理一些我们的业务逻辑。

实例代码:
http.interceptors.request.use(
  (config) => {
    // 如果开启 token 认证
    if (serverConfig.useTokenAuthorization) {
      config.headers["Authorization"] = localStorage.getItem("token"); // 请求头携带 token
    }
    // 设置请求头
    if(!config.headers["content-type"]) { // 如果没有设置请求头
      if(config.method === 'post') {
        config.headers["content-type"] = "application/x-www-form-urlencoded"; // post 请求
        config.data = qs.stringify(config.data); // 序列化,比如表单数据
      } else {
        config.headers["content-type"] = "application/json"; // 默认类型
      }
    }
    //请求时的进度条
    nprogress.start();
    return config;
  },
  (error) => {
    Promise.reject(error);
  }
);

我们通过调用 axios的实例方法进行请求拦截,并且下载了nprogress进度条插件,请求的时候使用start()方法,让进度条开始动。

4.设置响应拦截器

axios 请求的返回结果里面包含了很多东西,我们的业务层面通常只需要后端返回的数据即可,所以我们需要设置相应拦截,在响应结果返回给业务层之前做一些操作

实例代码:
// 设置响应拦截器
http.interceptors.response.use(
    res => {
        //拿到后端返回的data值
        let data = res.data;
        //启用nprogress结束动画
        nprogress.done()
        return data
    }, error => {
        return Promise.reject(error)
    }
)

上述代码返回了一个请求完成之后拿到data的值,以及使用了进度条结束功能done()方法

5.封装请求方法

import http from '../http';

export const getUserInfo = (params) => {
  return serviceAxios({
    url: "/api/user/users",
    method: "post",
    params,
  });
};

export const login = (data) => {
  return serviceAxios({
    url: "/api/user/login",
    method: "post",
    data,
  });
};

重新创建一个文件夹,里面放请求的方法,并导出,get请求需要传params,post请求需要传data

6.调用方法

import { login } from "@/http/api/user"
async loginAsync() {
  let params = {
    email: "123",
    password: "12321"
  }
  let data = await login(params);
  console.log(data);
}

7.总结

我们这里只做了最最最基础的 axios 封装,但是可扩展性较高。因为看别的文章封装的太复杂了,这里的封装形式其实可以满足大部分应用场景了。希望对你们有用

一边学习一边更新,有写的不好的地方,希望大家提出意见

### Vue 3 中 Axios简易封装 #### 创建 `utils` 文件夹及其子文件 在项目根目录创建名为 `utils` 的文件夹,并在其内部建立两个文件:`requests.js` 和 `html.js`。其中,`requests.js` 负责配置 Axios 实例的基础选项、定义全局的请求与响应拦截器。 ```javascript // utils/requests.js import axios from 'axios'; const service = axios.create({ baseURL: 'http://localhost:3000', timeout: 10000, }); service.interceptors.request.use( (config) => { // 可在此处添加通用头部信息或其他预处理逻辑 return config; }, (error) => { return Promise.reject(error); } ); service.interceptors.response.use( (response) => response.data, // 假设服务器总是返回带有 data 属性的对象 (error) => { return Promise.reject(error); } ); export default service; ``` 此部分实现了 Axios 客户端实例化并设置了基本参数如基础 URL 和超时时间[^3]。 #### 将服务集成至应用入口 为了让整个应用程序能够访问这个共享的服务对象,在项目的主启动文件(通常是 `main.ts` 或者 `main.js`)里导入之前定义好的初始化函数: ```typescript // src/main.ts import { createApp } from 'vue'; import App from './App.vue'; import router from './router'; // 如果有路由的话 import store from './store'; // 如果有状态管理库的话 import { instanceInit } from './apis/index'; instanceInit(); createApp(App).use(router).use(store).mount('#app'); ``` 这里通过调用 `instanceInit()` 来完成必要的初始化工作[^2]。 #### 编写 API 函数 最后一步是在适当的位置编写具体的 API 请求方法。可以按照功能模块划分不同的 JavaScript 文件来组织这些API接口。例如,对于登录操作来说可以在某个地方这样定义它: ```typescript // apis/userApi.ts import request from '@/utils/requests'; export function login(username:string,password:string){ return request.get('/index.php/index/index/index',{ params:{username,password} }); } /* 更多 api 方法 */ ``` 上述代码片段展示了如何基于前面构建的服务来进行 GET 类型的数据获取请求[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值