目录
安装和基础知识
全局配置
自定义实例
拦截器
首页 web前端 css教程 使用AXIOS进行API请求保持干燥

使用AXIOS进行API请求保持干燥

Apr 05, 2025 am 09:40 AM

Stay DRY Using axios for API Requests

任何与后端服务器通信的 Web 应用程序都离不开 HTTP 请求。前端需要数据,因此它通过网络 HTTP 请求(或通常所说的 Ajax)请求数据,服务器返回答案。如今几乎每个网站都以某种方式执行此操作。

对于大型网站,我们可以预期会看到更多这样的请求。更多数据、更多 API 和更多特殊情况。随着网站规模的增长,保持组织性非常重要。一个经典的概念是 DRY(Don't Repeat Yourself,不要重复自己),它指的是抽象代码以防止重复的过程。这是理想的,因为它通常允许我们编写一次代码,在多个地方使用它,并在单个位置进行更新,而不是在每个实例中进行更新。

我们还可以使用库来帮助我们。对于 Ajax,axios 是一个流行的选择。您可能已经熟悉它,甚至在开发过程中将其用于独立的 POST 和 GET 请求。

安装和基础知识

可以使用 npm(或 yarn)安装它:

npm install axios
登录后复制

使用 Axios 的独立 POST 请求如下所示:

axios.post('https://axios-app.firebaseio.com/users.json', formData)
  .then(res => console.log(res))
  .catch(error => console.log(error))
登录后复制

原生 JavaScript 也有多种方法可以执行 JavaScript 代码。值得注意的是,fetch()。那么为什么还要使用库呢?首先,fetch 的错误处理非常奇怪。从一开始,使用 axios 就会轻松很多。如果您想查看比较,我们有一篇文章同时介绍了这两种方法,还有一篇文章讨论了这种抽象方法的价值。

另一个使用 axios 的原因?它为我们提供了更多 DRY 的机会,所以让我们来看看。

全局配置

我们可以设置一个全局配置(例如,在我们的 main.js 文件中),使用标准配置处理所有应用程序请求,该配置通过 axios 附带的默认对象设置。

此对象包含:

  • baseURL:用作所有请求前缀的相对 URL,每个请求都可以附加 URL
  • headers:可以根据请求设置的自定义标头
  • timeout:请求中止的时间点,通常以毫秒为单位。默认值为 0,表示不适用。
  • withCredentials:指示是否应使用凭据进行跨站点访问控制请求。默认为 false。
  • responseType:指示服务器将返回的数据类型,选项包括 json(默认)、arraybuffer、document、text 和 stream。
  • responseEncoding:指示用于解码响应的编码。默认值为 utf8。
  • xsrfCookieName:用作 XSRF 令牌值的 Cookie 的名称,默认值为 XSRF-TOKEN。
  • xsrfHeaderName:承载 XSRF 令牌值的 HTTP 标头的名称。默认值为 X-XSRF-TOKEN。
  • maxContentLength:定义允许的 HTTP 响应内容的最大大小(以字节为单位)
  • maxBodyLength:定义允许的 HTTP 请求内容的最大大小(以字节为单位)

大多数情况下,您只会使用 baseURL、header 和可能还有 timeout。其余的不太常用,因为它们有智能默认值,但如果您需要修复请求,了解它们的存在是很好的。

这就是 DRY 的作用。对于每个请求,我们不必重复 API 的 baseURL 或重复我们可能在每个请求中都需要的重要标头。

这是一个示例,其中我们的 API 有一个基址,但它也有多个不同的端点。首先,我们设置一些默认值:

// main.js
import axios from 'axios';

axios.defaults.baseURL = 'https://axios-app.firebaseio.com' // URL 前缀
axios.defaults.headers.get['Accept'] = 'application/json'  // 所有 GET 请求的默认标头
axios.defaults.headers.post['Accept'] = 'application/json' // 所有 POST 请求的默认标头

// 然后,在一个组件中,我们可以更简洁地使用 axios,不需要设置这些标头,但仍然有机会自定义最终的 URL 端点:

// form.js 组件
import axios from 'axios';

export default {
  methods: {
    onSubmit() {
      // URL 现在是 https://axios-app.firebaseio.com/users.json
      axios.post('/users.json', formData)
        .then(res => console.log(res))
        .catch(error => console.log(error))
    }
  }
}
登录后复制

注意:此示例在 Vue 中,但此概念扩展到任何 JavaScript 环境。

自定义实例

设置“自定义实例”类似于全局配置,但作用域限定为指定的组件。因此,它仍然是一种 DRY 技术,但具有层次结构。

我们将在一个新文件中设置我们的自定义实例(让我们将其命名为 authAxios.js),并将其导入到“关注”组件中。

// authAxios.js
import axios from 'axios'

const customInstance = axios.create({
  baseURL: 'https://axios-app.firebaseio.com'
})
customInstance.defaults.headers.post['Accept'] = 'application/json'

// 或像这样...
const customInstance = axios.create({
  baseURL: 'https://axios-app.firebaseio.com',
  headers: {'Accept': 'application/json'}
})
登录后复制

然后我们将此文件导入表单组件:

// form.js 组件

// 从我们的自定义实例导入
import axios from './authAxios'

export default {
  methods: {
    onSubmit() {
      axios.post('/users.json', formData)
        .then(res => console.log(res))
        .catch(error => console.log(error))
    }
  }
}
登录后复制

拦截器

拦截器可以处理全局配置或自定义实例可能过于通用的情况,这意味着如果您在其对象中设置了标头,则它将应用于受影响组件中每个请求的标头。拦截器能够动态更改任何对象属性。例如,我们可以根据我们在拦截器中选择的任何条件发送不同的标头(即使我们在对象中设置了标头)。

拦截器可以在 main.js 文件或自定义实例文件中。请求在发送后被拦截,并允许我们更改响应的处理方式。

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前执行某些操作,例如,我们只为具有特定 baseURL 的请求插入超时
  if (config.baseURL === 'https://axios-app.firebaseio.com/users.json') {
    config.timeout = 4000
  } else {
    return config
  }
  console.log(config)
  return config;
}, function (error) {
  // 对请求错误执行某些操作
  return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 对响应数据执行某些操作,例如 console.log、更改标头,或者像我们在这里所做的那样添加条件行为,根据响应状态更改路由或弹出警报框
  if (response.status === 200 || response.status === 201) {
    router.replace('homepage')
  } else {
    alert('异常行为')
  }
  console.log(response)
  return response;
}, function (error) {
  // 对响应错误执行某些操作
  return Promise.reject(error);
});
登录后复制

拦截器顾名思义,拦截请求和响应,以根据提供的任何条件采取不同的行为。例如,在上面的请求拦截器中,我们只在请求具有特定 baseURL 时插入条件超时。对于响应,我们可以拦截它并修改我们返回的内容,例如更改路由或显示警报框,具体取决于状态代码。我们甚至可以根据不同的错误代码提供多个条件。

随着项目规模的扩大,您开始拥有许多路由和嵌套路由,所有这些路由都基于不同的触发器与服务器通信,拦截器将非常有用。除了我在上面设置的条件之外,还有许多其他情况可能需要使用拦截器,具体取决于您的项目。

有趣的是,我们可以弹出拦截器以阻止其产生任何影响。我们必须将拦截器分配给一个变量,并使用恰当命名的弹出方法将其弹出。

const reqInterceptor = axios.interceptors.request.use(function (config) {
  // 在发送请求之前执行某些操作,例如,我们只为具有特定 baseURL 的请求插入超时
  if (config.baseURL === 'https://axios-app.firebaseio.com/users.json') {
    config.timeout = 4000
  } else {
    return config
  }
  console.log(config)
  return config;
}, function (error) {
  // 对请求错误执行某些操作
  return Promise.reject(error);
});

// 添加响应拦截器
const resInterceptor = axios.interceptors.response.use(function (response) {
  // 对响应数据执行某些操作,例如 console.log、更改标头,或者像我们在这里所做的那样添加条件行为,根据响应状态更改路由或弹出警报框
  if (response.status === 200 || response.status === 201) {
    router.replace('homepage')
  } else {
    alert('异常行为')
  }
  console.log(response)
  return response;
}, function (error) {
  // 对响应错误执行某些操作
  return Promise.reject(error);
});

axios.interceptors.request.eject(reqInterceptor);
axios.interceptors.request.eject(resInterceptor);
登录后复制

虽然不太常用,但可以将拦截器放入条件语句中,或者根据某些事件将其删除。

希望这能让你很好地了解 axios 的工作方式,以及如何在应用程序中使用它来保持 API 请求的 DRY 原则。虽然我们通过列出常见用例和配置来触及表面,但 axios 还有许多其他优点,您可以在文档中探索,包括取消请求和防止跨站点请求伪造的能力,以及其他令人惊叹的可能性。

以上是使用AXIOS进行API请求保持干燥的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1653
14
CakePHP 教程
1413
52
Laravel 教程
1304
25
PHP教程
1251
29
C# 教程
1224
24
带有粘性定位的堆叠卡和一点点的杂物 带有粘性定位的堆叠卡和一点点的杂物 Apr 03, 2025 am 10:30 AM

前几天,我发现了科里·金尼文(Corey Ginnivan)网站上的这一点,当您滚动时,彼此之间的卡片堆放集。

Google字体可变字体 Google字体可变字体 Apr 09, 2025 am 10:42 AM

我看到Google字体推出了新设计(Tweet)。与上一次大型重新设计相比,这感觉更加迭代。我几乎无法分辨出区别

如何使用HTML,CSS和JavaScript创建动画倒计时计时器 如何使用HTML,CSS和JavaScript创建动画倒计时计时器 Apr 11, 2025 am 11:29 AM

您是否曾经在项目上需要一个倒计时计时器?对于这样的东西,可以自然访问插件,但实际上更多

HTML数据属性指南 HTML数据属性指南 Apr 11, 2025 am 11:50 AM

您想了解的有关HTML,CSS和JavaScript中数据属性的所有信息。

为什么Flex布局中的紫色斜线区域会被误认为是'溢出空间”? 为什么Flex布局中的紫色斜线区域会被误认为是'溢出空间”? Apr 05, 2025 pm 05:51 PM

关于Flex布局中紫色斜线区域的疑问在使用Flex布局时,你可能会遇到一些令人困惑的现象,比如在开发者工具(d...

如何通过CSS选择第一个类名为item的子元素? 如何通过CSS选择第一个类名为item的子元素? Apr 05, 2025 pm 11:24 PM

在元素个数不固定的情况下如何通过CSS选择第一个指定类名的子元素在处理HTML结构时,常常会遇到元素个数不�...

使Sass更快的概念证明 使Sass更快的概念证明 Apr 16, 2025 am 10:38 AM

在一个新项目开始时,Sass汇编发生在眼睛的眨眼中。感觉很棒,尤其是当它与browsersync配对时,它重新加载

在前端开发中,如何使用CSS和JavaScript实现类似Windows 10设置界面的探照灯效果? 在前端开发中,如何使用CSS和JavaScript实现类似Windows 10设置界面的探照灯效果? Apr 05, 2025 pm 10:21 PM

在前端开发中如何实现类似Windows...

See all articles