axios和fetch的区别

前言

Axios和Fetch都是JavaScript中常用的HTTP请求库。它们有一些相似之处,例如可以在浏览器和Node.js中使用,都支持PromiseAPI等。但是,它们之间也有一些区别:

区别

  1. API和用法
    Axios和Fetch都提供了一个API来发起HTTP请求,但是它们的用法略有不同。Axios使用一个相对简单的API,它只需要传入一个配置对象即可发起请求,而Fetch需要通过构造一个Request对象来创建请求,然后使用fetch()函数来发起请求。

    Axios示例:

    axios.get('/api/data')
      .then(function (response) {
    	console.log(response.data);
      })
      .catch(function (error) {
    	console.log(error);
      });
    

    Fetch示例:

    fetch('/api/data')
      .then(function(response) {
    	return response.json();
      })
      .then(function(data) {
    	console.log(data);
      })
      .catch(function(error) {
    	console.log(error);
      });
    
  2. 对于请求的拦截和处理
    Axios提供了一个拦截器(interceptor)的功能,可以在请求发送前、请求发送后、响应返回前、响应返回后等各个阶段添加处理函数。这个功能非常强大,可以用于添加公共的请求头、错误处理、请求的取消等。

    而Fetch则没有提供类似的功能,需要通过手动的方式来处理请求和响应。

  3. 浏览器兼容性
    Fetch是原生的浏览器API,但是它不支持IE11和以下版本的浏览器。而Axios基于XMLHttpRequest实现,可以兼容所有的浏览器,包括IE11。

  4. 功能扩展
    Axios还提供了一些其他的功能,例如文件上传、请求取消、JSONP等,而Fetch没有提供。

总之,Axios和Fetch都是非常优秀的HTTP请求库,选择哪一个取决于个人的需求和偏好。如果需要在IE11及以下浏览器中使用,则必须选择Axios。如果需要使用拦截器、请求取消等高级功能,则可以选择Axios。如果需要在现代浏览器中使用,并且对API的简单性有要求,则可以选择Fetch。

代码示例

import CryptoJS from "crypto-js";
import axios from "axios";

const baseUrl = "https://www.fastmock.site/mock/52a49158b806e9907b4ed46ee3cccc23/mock";
const timestamp = new Date().getTime();
const appToken = "abcd";
const hash = CryptoJS.HmacSHA256(timestamp, appToken).toString();

export function fetchRequest(url = "/api") {
  return fetch(baseUrl + url, {
    method: "GET", // 请求方法,如为POST请求需要发送body
    headers: {
      "Content-Type": "application/json",

      /**
       * Authorization 头通常用于在API请求中携带用户认证信息,以保护API的安全性。
       * 例如,某个API需要进行用户身份验证,只有在携带有效的认证信息(例如用户名和密码)的情况下才能够进行访问,
       * 这时就可以在API请求的Authorization头中携带认证信息,以实现身份验证的目的。
       * 同时,为了保护认证信息的安全性,通常会使用HTTPS协议来加密API请求,以防止信息被恶意截获。
       */
      Authorization: `Bearer ${appToken}`,

      /*
        在Web开发中,Signature通常指的是API请求中的签名信息,用于验证请求的完整性和真实性。通常情况下,
        签名信息是由API请求的各个参数按照一定的规则计算得出的,以确保请求的唯一性和完整性,防止请求被篡改或重放攻击。
        具体来说,API请求的签名过程通常包括以下几个步骤:

        将API请求中的各个参数按照一定的规则拼接起来,形成一个待签名的字符串;
        将待签名的字符串使用某种算法(例如HMAC-SHA256)进行加密,生成签名字符串;
        将签名字符串添加到API请求的参数中,以便服务器能够验证请求的完整性和真实性。
        在API请求的处理过程中,服务器会使用相同的签名算法和密钥对请求的签名信息进行验证,以确保请求的完整性和真实性。
        如果请求的签名信息和服务器计算得到的签名信息不一致,则表明请求可能被篡改或伪造,服务器应该拒绝处理该请求,并返回错误信息。

        Signature机制通常用于保护API请求的安全性和可靠性,以防止恶意攻击和误操作对API服务造成损失。
        在实际开发中,Signature机制通常与HTTPS协议、Access Token等技术一起使用,以构建安全可靠的API服务。
       */
      Signature: hash,
      Timestamp: timestamp,
    },
  });
}

export function axiosInstance(url = "/api") {
  // 创建一个axios实例
  const service = axios.create({
    baseURL: baseUrl + url, // API的基础路径
    timeout: 3000, // 请求超时时间
  });

  // 添加请求拦截器
  service.interceptors.request.use(
    (config) => {
      // 在请求发送之前做些什么
      config.headers["Authorization"] = "Bearer " + appToken;
      config.headers["Signature"] = hash;
      config.headers["Timestamp"] = timestamp;
      config.headers["Content-Type"] = "application/json;charset=UTF-8";
      return config;
    },
    (error) => {
      /* 
        对请求错误做些什么:常见为一下几种:

        显示错误提示:如果API请求失败,通常需要向用户显示错误提示,以便用户能够了解错误原因并进行相应的处理。

        重试请求:如果API请求失败,可以尝试重新发送请求,以提高请求的成功率。通常会设置重试次数和重试间隔等参数,以防止过度请求和服务器负载过大等问题。

        缓存数据:如果API请求失败,可以尝试从缓存中获取已有的数据,以提供给用户进行展示。在后续请求时,可以尝试更新缓存数据,以保持数据的最新状态。

        日志记录:如果API请求失败,可以将错误信息记录到日志中,以便开发人员进行分析和排查。通常会记录错误的时间、请求参数、错误信息、堆栈信息等内容。

        抛出异常:如果API请求失败,可以将错误信息封装成异常对象,以便于后续进行处理和捕获。通常会包括错误代码、错误信息、错误原因等内容。
      */
      return Promise.reject(error);
    }
  );

  // 添加响应拦截器
  service.interceptors.response.use(
    (response) => {
      /* 
        对响应数据做些什么:常见为以下几种
    
        解析响应数据:如果API请求成功,通常需要解析响应数据,以提取出需要的数据和信息,以供后续的处理和展示。

        更新页面状态:如果API请求成功,可以根据响应数据更新页面状态,以展示数据和反馈操作结果。例如,可以更新页面内容、刷新表格、提示用户操作成功等。

        跳转页面:如果API请求成功,并需要进行页面跳转,可以使用路由组件进行跳转,以展示相关页面。例如,可以跳转到详情页面、编辑页面、列表页面等。

        缓存数据:如果API请求成功,可以将响应数据进行缓存,以提高下次请求的速度和效率。例如,可以使用LocalStorage、SessionStorage等进行数据存储。

        日志记录:如果API请求成功,可以将响应数据记录到日志中,以便开发人员进行分析和优化。通常会记录请求时间、响应数据、请求参数等内容。
      */
      return response.data;
    },
    (error) => {
      // 对响应错误做些什么
      return Promise.reject(error);
    }
  );

  return service;
}
posted @ 2023-03-06 15:21  ychizzz  阅读(1253)  评论(0编辑  收藏  举报