JS中封装axios来管控api的2种方式

在JS中,使用axios作为网络请求库是非常常见的。在实际应用中,我们需要封装axios来管理API,以便于维护和升级。这里介绍两种常见的封装axios的方式。

方式一:基于axios.create()方法

通过axios.create()方法创建一个新的axios实例,然后在这个实例中设置一些统一的请求头、请求拦截器和响应拦截器等。示例代码如下:

import axios from 'axios';

const instance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  }
});

instance.interceptors.request.use(config => {
  // 在发送请求之前做些什么
  return config;
}, error => {
  // 对请求错误做些什么
  return Promise.reject(error);
});

instance.interceptors.response.use(response => {
  // 对响应数据做点什么
  return response;
}, error => {
  // 对响应错误做点什么
  return Promise.reject(error);
});

export default instance;

在这个实例中,我们设置了基本的服务器地址、超时时间和请求头信息,并且增加了请求拦截器和响应拦截器,可以方便地在请求和响应前后执行相关操作,比如在请求头中添加token等。

我们可以在应用中直接使用这个实例的get、post等方法,例如:

import instance from './api-instance';

instance.get('/user', {
  params: {
    id: 12345
  }
}).then(response => {
  // 处理响应结果
}).catch(error => {
  // 处理请求错误
});

方式二:创建一个API管理类

创建一个API类,然后在这个类中定义各个API的请求方式、URL、请求参数、响应参数等信息,并为这些API创建一个统一的请求方法。示例代码如下:

import axios from 'axios';

class Api {
  constructor() {
    this._baseUrl = 'https://api.example.com';
    this._timeout = 10000;
    this._headers = {
      'Content-Type': 'application/json'
    };
    this._http = axios.create({
      baseURL: this._baseUrl,
      timeout: this._timeout,
      headers: this._headers
    });
    this._http.interceptors.request.use(config => {
      // 在发送请求之前做些什么
      return config;
    }, error => {
      // 对请求错误做些什么
      return Promise.reject(error);
    });
    this._http.interceptors.response.use(response => {
      // 对响应数据做点什么
      return response.data;
    }, error => {
      // 对响应错误做点什么
      return Promise.reject(error);
    });
    this._apiMap = {
      getUser: {
        url: '/user',
        method: 'get',
        params: ['id']
      },
      postUser: {
        url: '/user',
        method: 'post',
        data: ['name', 'age']
      }
    };
  }

  call(apiName, data = {}) {
    const apiInfo = this._apiMap[apiName];
    if (!apiInfo) {
      console.error(`API ${apiName} not found`);
      return;
    }
    const {url, method, params = [], data: dataKeys = []} = apiInfo;
    const requestData = {};
    params.forEach(paramKey => {
      requestData[paramKey] = data[paramKey];
    });
    const postData = {};
    dataKeys.forEach(dataKey => {
      postData[dataKey] = data[dataKey];
    });
    if (method === 'get') {
      return this._http.get(url, {
        params: requestData
      });
    } else if (method === 'post') {
      return this._http.post(url, postData);
    } else {
      return Promise.reject(`unsupported request method ${method}`);
    }
  }
}

export default new Api();

在这个类中,我们创建了一个_http对象,并为它设置了基本的服务器地址、超时时间和请求头信息,并且增加了请求拦截器和响应拦截器,与之前的方法相似。另外,我们在类中定义了一个apiMap对象,其中包含了我们所有API的请求方式、URL、请求参数、响应参数等信息。最后,我们定义了一个call方法,用于根据apiMap中的信息来发出请求并返回响应。

我们可以在应用中直接使用这个APi类的call方法,例如:

import api from './api';

api.call('getUser', {
  id: 12345
}).then(response => {
  // 处理响应结果
}).catch(error => {
  // 处理请求错误
});

这样就可以方便地管理和调用所有API,并且在后续的维护和升级中也会更加便捷。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS中封装axios来管控api的2种方式 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • vue3.x使用swiperUI动态加载图片失败的解决方法

    Vue3.x使用SwiperUI动态加载图片失败的解决方法攻略 SwiperUI是一个流行的Vue组件库,用于创建滑动轮播图等交互效果。在使用SwiperUI时,有时会遇到动态加载图片失败的问题。下面是解决这个问题的完整攻略。 1. 确保图片路径正确 首先,确保你提供给SwiperUI的图片路径是正确的。检查图片路径是否包含正确的文件名、文件格式和文件路径。…

    other 2023年8月3日
    00
  • sql跨库查询

    SQL跨库查询 SQL(Structured Query Language)是一种用于管理关系型数据库的编程语言,具有广泛的应用性。当我们需要在多个数据库之间进行查询时,就需要使用SQL跨库查询。 什么是跨库查询 跨库查询即在不同的数据库中进行数据查询。在现实应用场景中,经常会有需要在不同的数据库中查询数据的情况,而跨库查询就是为这种情况提供的解决方案。 如…

    其他 2023年3月29日
    00
  • JS日期和时间选择控件升级版(自写)

    下面我就为你详细讲解一下”JS日期和时间选择控件升级版(自写)”的完整攻略。 1. 背景介绍 本文主要介绍如何通过自己编写一个JavaScript日期和时间选择控件的方式,来实现对于日期和时间输入的便捷操作和规范化处理,提高用户使用体验。 2. 实现原理 该日期和时间选择控件的实现原理主要是基于JavaScript、HTML、CSS技术,包括以下几个步骤: …

    other 2023年6月26日
    00
  • linuxjconsole的远程配置–实测可用

    以下是Linux JConsole的远程配置攻略,包含两个示例: 步骤1:启用JMX远程访问 在Linux中,您需要编辑JMX配置文件以启用远程访问。打开终端并输入以下命令: sudo nano /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/management/jmxremote.access 打开的文件中,找到以下行…

    other 2023年5月6日
    00
  • sed使用删除匹配行

    以下是详细讲解“sed使用删除匹配行的完整攻略,过程中至少包含两条示例说明”的标准Markdown格式文本: sed使用删除匹配行 sed是一种流编辑器,可以用于对文本进行编辑和转换。其中,删除匹配行是sed的一种常见用法。本攻略将介绍如何使用sed删除匹配行,包括基本语法和常用选项。同时,本攻略还提供了两个示例说明,帮助您更好地理解和应用这些技术。 基本语…

    other 2023年5月10日
    00
  • 易语言数据库操作“取字段数”命令

    下面是“易语言数据库操作-取字段数”命令的详细攻略。 1. 命令说明 “取字段数”命令是易语言中用于获取数据库表字段数量的命令。该命令需要使用到数据库对象,在执行该命令前需要先打开数据库。 2. 操作步骤 2.1 打开数据库 在使用“取字段数”命令前,需要先打开数据库。可使用“打开数据库”命令来打开数据库。以下是打开Access数据库的示例代码: //创建数…

    other 2023年6月25日
    00
  • C++设计模式之工厂模式

    接下来我将详细讲解C++设计模式之工厂模式的完整攻略。 工厂模式概述 工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们使用一个工厂方法来创建对象,而不是直接通过new来创建。这样有助于我们实现松耦合和高内聚。 工厂模式的核心思想是定义一个用来创建对象的接口,让子类决定具体要实例化对象的类。这样…

    other 2023年6月27日
    00
  • 解密Python中的作用域与名字空间

    当涉及到Python中的作用域和命名空间时,以下是一个完整的攻略,其中包含两个示例说明。 … … … 作用域 作用域是指变量在程序中可访问的范围。在Python中,有四种作用域:内置作用域、全局作用域、局部作用域和非局部作用域。 1. … … 作用域 内置作用域是Python解释器中预定义的作用域,包含了一些内置的函数和对象,如print…

    other 2023年8月10日
    00
合作推广
合作推广
分享本页
返回顶部