Ajax、Fetch、Axios 三者的区别

508 阅读2分钟

前言

发送请求是前端和后端交互的最重要的途径,也是面试过程中面试官很喜欢问的一个问题,关于前端如何发送请求,你能说出哪些方式呢?日常开发更多可能接触到的是 Ajax、Fetch、Axios 这三种。本文将简单地介绍这三者以及他们的区别。

Ajax

Ajax 全称是 Asynchronous JavaScript And XML,翻译过来就是“异步的 Javascript 和 XML”。Ajax 是一个 技术统称,是一个 概念模型,它囊括了很多技术,并不特指某一技术,它很重要的特性之一就是 让页面实现局部刷新

XMLHttpRequest 只是实现 Ajax 的一种方式。其中 XMLHttpRequest 模块就是实现 Ajax 的一种很好的方式。

利用 XMLHttpRequest 模块实现 Ajax:

function ajax(url) {
  const xhr = new XMLHttpRequest();
  xhr.open("get", url, false);
  xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
      console.info("响应结果", xhr.response);
    }
  };
  xhr.send(null);
}

ajax("https://smallpig.site/api/category/getCategory");

优点:减轻服务器压力、支持多种数据格式。

缺点:对 SEO 不友好、可能会导致 XSS、CSRF 等安全问题、开发复杂度高,容易出现回调地狱。

Fetch

Fetch 是一个在 ES6 出现的 API,它是基于 promise 的。它是 XMLHttpRequest 的替代品。

fetch 方法可以接收两个参数 input 和 options

  • input 参数可以是字符串,包含要获取资源的 URL。也可以是一个 Request 对象。

options 是一个可选参数。一个配置项对象,包括所有对请求的设置。可选的参数有:

method: 请求使用的方法,如 GET、POST。

headers: 请求的头信息,包含与请求关联的 Headers 对象。

body: 请求的 body 信息。注意 GET 或 HEAD 方法的请求不能包含 body 信息。

mode: 请求的模式,如 cors、 no-cors 或者 same-origin。

credentials: 请求的 credentials,如 omit、same-origin 或者 include。为了在当前域名内自动发送 cookie,必须提供这个选项。

示例如下:

function ajaxFetch(url) {
  fetch(url)
    .then((res) => res.json())
    .then((data) => {
      console.info(data);
    });
}

ajaxFetch("https://smallpig.site/api/category/getCategory");

优点:解决了回调地狱的问题,代码的可读性好,易于维护。

Axios

Axios 是一个基于 promise 封装的 网络请求库,它是基于 XHR 进行二次封装的。

特点:

  • 可以从浏览器中创建 XMLHttpRequest,从 node.js 创建 http 请求
  • 支持 Promise API
  • 可以拦截请求和响应,转换请求数据和响应数据,自动转换 JSON 数据
  • 客户端支持防御 XSRF

示例如下:

// 封装 axios
// 实例化 添加请求拦截器和响应拦截器
import axios from "axios";

const http = axios.create({
  baseURL: "http://geek.itheima.net/v1_0",
  timeout: 5000,
});

// 添加请求拦截器
http.interceptors.request.use(
  (config) => {
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 添加响应拦截器
http.interceptors.response.use(
  (response) => {
    // 2xx 状态码会触发该函数
    return response.data;
  },
  (error) => {
    return Promise.reject(error);
  }
);

最后

以上就是笔者对 Ajax、Fetch、Axios 这三种实现网络请求方式的简单介绍,如需补充或有不足,欢迎大家在评论区指出......