JavaScript中的axios

在 Web 开发中,前端与后端的数据交互几乎无处不在。从早期的 XMLHttpRequest 到如今流行的 axios,HTTP 请求技术不断演进,变得更简洁、更强大。本文将带你从 AJAX 的基础讲起,重点介绍 axios 的使用方法和最佳实践。

一. AJAX 简介

AJAX (Asynchronous JavaScript and XML)是一种在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术。它的核心是 XMLHttpRequest 对象,但直接使用它会比较繁琐:

javascript 复制代码
var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/user', true);
xhr.onreadystatechange = function() {
  if (xhr.readyState === 4 && xhr.status === 200) {
    console.log(xhr.responseText);
  }
};
xhr.send();

二. Axios 是什么?

Axios 是一个基于 Promise 的 HTTP 客户端,可用于浏览器和 Node.js。它有以下特点:

(1)支持 Promise API

(2)拦截请求和响应

(3)转换请求和响应数据

(4)自动转换 JSON 数据

(5)客户端支持防御 XSRF

三. 安装与基本使用

javascript 复制代码
npm install axios
# 或
yarn add axios

1. 基本 GET 请求

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

axios.get('/api/user?ID=12345')
  .then(function (response) {
    console.log(response.data);
  })
  .catch(function (error) {
    console.log(error);
  });

2. 带参数的 GET 请求

javascript 复制代码
axios.get('/api/user', {
    params: {
      ID: 12345
    }
  })
  .then(response => console.log(response.data))
  .catch(error => console.error(error));

3. POST 请求

javascript 复制代码
axios.post('/api/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(response => console.log(response))
  .catch(error => console.error(error));

四. 并发请求

Axios 提供了 axios.all 和 axios.spread 来处理并发请求:

javascript 复制代码
function getUserAccount() {
  return axios.get('/api/user/12345');
}

function getUserPermissions() {
  return axios.get('/api/user/12345/permissions');
}

axios.all([getUserAccount(), getUserPermissions()])
  .then(axios.spread(function (acct, perms) {
    // 两个请求都完成了
    console.log(acct.data, perms.data);
  }));

五. 请求与响应拦截器

拦截器可以在请求发送前或响应返回后做一些统一处理:

javascript 复制代码
// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 在发送请求前做些什么
    config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 响应拦截器
axios.interceptors.response.use(
  response => response,
  error => {
    // 对响应错误做点什么
    if (error.response.status === 401) {
      // 未授权,跳转登录页
      window.location.href = '/login';
    }
    return Promise.reject(error);
  }
);

六. 创建实例

当项目中有多个 API 地址或需要不同配置时,可以创建 axios 实例:

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

instance.get('/user')
  .then(response => console.log(response.data));

七. 错误处理

Axios 的错误处理非常灵活:

javascript 复制代码
axios.get('/api/user/12345')
  .catch(error => {
    if (error.response) {
      // 请求已发出,服务器用状态码响应(非 2xx)
      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);
    }
    console.log(error.config);
  });

八. 取消请求

Axios 支持取消尚未完成的请求:

javascript 复制代码
const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/api/user/12345', {
  cancelToken: source.token
}).catch(thrown => {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled:', thrown.message);
  }
});

// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');

九. 总结

Axios 已经成为现代前端开发中处理 HTTP 请求的首选库,它简化了 AJAX 的使用方式,提供了丰富的功能和优秀的错误处理机制。无论是简单的 GET 请求还是复杂的并发请求和拦截处理,Axios 都能胜任。

相关推荐
我材不敲代码3 小时前
Python实现打包贪吃蛇游戏
开发语言·python·游戏
2501_920931704 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
身如柳絮随风扬4 小时前
Java中的CAS机制详解
java·开发语言
韩立学长6 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
东东5166 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
froginwe116 小时前
Scala 循环
开发语言
catino6 小时前
图片、文件的预览
前端·javascript
m0_706653236 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你917 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Bruk.Liu7 小时前
(LangChain实战2):LangChain消息(message)的使用
开发语言·langchain