详解ajax、fetch、axios的区别

众所周知它们都用来发送请求,其实它们区别还蛮大的。这也是面试中的高频题,本文将详细进行讲解。

1. ajax

英译过来是Aysnchronous JavaScript And XML,直译是异步JSXMLXML类似HTML,但是设计宗旨就为了传输数据,现已被JSON代替),解释一下就是说XML作为数据传输格式发送JS异步请求。但实际上ajax是一个一类技术的统称的术语,包括XMLHttpRequestJSCSSDOM等,它主要实现网页拿到请求数据后不用刷新整个页面也能呈现最新的数据

下面我们简单封装一个ajax请求【面试高频题】:

const ajaxGet = function (url) {
    const xhr = new XMLHttpRequest()
    xhr.open('get', url)
    xhr.onreadystatechange = () => {
        if (xhr.readyState == 4) {
            if (xhr.status >= 200 && xhr.status < 400) {
                console.log(xhr.response);  // 响应结果
            }
        }
    }
    xhr.onerror = (error) => {
        console.log(error, xhr.status)
    }
    xhr.send()
}

2. fetch

它其实就是一个JS自带的发送请求的一个api,拿来跟ajax对比是完全不合理的,它们完全不是一个概念的东西,适合拿来和fetch对比的其实是xhr,也就是上面封装ajax请求的代码里的XMLHttpRequest,这两都是JS自带的发请求的方法,而fetchES6出现的,自然功能比xhr更强,主要原因就是它是基于Promise的,它返回一个Promise,因此可以使用.then(res => )的方式链式处理请求结果,这不仅提高了代码的可读性,还避免了回调地狱(xhr通过xhr.onreadystatechange= () => {}这样回调的方式监控请求状态,要是想在请求后再发送请求就要在回调函数内再发送请求,这样容易出现回调地狱)的问题。而且JS自带,语法也非常简洁,几行代码就能发起一个请求,用起来很方便,据说大佬都爱用。

它的特点是:

  • 使用 promise,不使用回调函数。
  • 采用模块化设计,比如 rep、res 等对象分散开来,比较友好。
  • 通过数据流对象处理数据,可以提高网站性能。

下面我们简单写个fetch请求的示例:

// get请求
fetch('http://127.0.0.1:8000/get')
    .then(res => {
    if (!res.ok) {
        throw new Error('请求错误!状态码为:', res.status)
    }
    return res.text()
}).then(data => {
    console.log(data);
})
// post请求
fetch('http://127.0.0.1:8000/post', {
    method: 'post',
    headers: {
        'Content-Type': 'application/json'
    },
    mode: 'no-cors',  // 设置cors表示只能发送跨域的请求,no-cors表示跨不跨域都能发
    body: JSON.stringify({
        name: 'zhangsan',
        age: 18
    })
}).then(res => {
    return res.json()
}).then(data => {
    console.log(data);
})

3. axios

axios是用于网络请求的第三方库,它是一个库。axios利用xhr进行了二次封装的请求库,xhr只是axios中的其中一个请求适配器,axios在nodejs端还有个http的请求适配器;axios = xhr + http;它返回一个Promise。【项目中经常需要封装的axios】

它的特点:

  • 在浏览器环境中创建 XMLHttpRequests;在node.js环境创建 http 请求
  • 返回Promise
  • 拦截请求和响应
  • 自动转换 JSON 数据
  • 转换请求数据和响应数据
  • 取消请求

它的基础语法是:

// 发送 Get 请求
axios({
    method: 'get',
    url: '',
    params: {}  // 查询query使用params
})
// 发送 Post 请求
axios({
    method: 'post',
    url: '',
    data: {}  // 请求体body用data
})

下面我们在vue项目中封装一个使用axios实现的请求。

libs/config.js:配置文件

const serverConfig = {
  baseUrl: "http://127.0.0.1:8000", // 请求基础地址,可根据环境自定义
  useTokenAuthentication: false, // 是否开启token认证
};
export default serverConfig;

libs/request.js:封装请求

import axios from "axios";  // 第三方库 需要安装
import serverConfig from "./config";
// 创建axios实例
const apiClient = axios.create({
  baseURL: serverConfig.baseUrl, // 基础请求地址
  withCredentials: false, // 跨域请求是否需要携带cookie
  headers: {
    Accept: "application/json",
    "Content-Type": "application/json",
  },
  timeout: 10000, // 请求超时时间
});

// 请求拦截
apiClient.interceptors.request.use(
  (config) => {
    // 请求发送前的处理逻辑 比如token认证,设置各种请求头啥的
    // 如果开启token认证
    if (serverConfig.useTokenAuthentication) {
      // 请求头携带token
      config.headers.Authorization = localStorage.getItem("token");
    }
    return config;
  },
  (error) => {
    // 请求发送失败的处理逻辑
    return Promise.reject(error);
  }
);

// 响应拦截
apiClient.interceptors.response.use(
  (response) => {
    // 响应数据处理逻辑,比如判断token是否过期等等
    // 代码块
    return response;
  },
  (error) => {
    // 响应数据失败的处理逻辑
    let message = "";
    if (error && error.response) {
      switch (error.response.status) {
        case 302:
          message = "接口重定向了!";
          break;
        case 400:
          message = "参数不正确!";
          break;
        case 401:
          message = "您未登录,或者登录已经超时,请先登录!";
          break;
        case 403:
          message = "您没有权限操作!";
          break;
        case 404:
          message = `请求地址出错: ${error.response.config.url}`;
          break;
        case 408:
          message = "请求超时!";
          break;
        case 409:
          message = "系统已存在相同数据!";
          break;
        case 500:
          message = "服务器内部错误!";
          break;
        case 501:
          message = "服务未实现!";
          break;
        case 502:
          message = "网关错误!";
          break;
        case 503:
          message = "服务不可用!";
          break;
        case 504:
          message = "服务暂时无法访问,请稍后再试!";
          break;
        case 505:
          message = "HTTP 版本不受支持!";
          break;
        default:
          message = "异常问题,请联系管理员!";
          break;
      }
    }
    return Promise.reject(message);
  }
);

export default apiClient;

/api/index.js:配置请求接口,这里一个get一个post

import apiClient from "@/libs/request";

let getInfo = (params) => {
  return apiClient({
    url: "/get",
    method: "get",
    params,  // axios的get请求query用params
  });
};
let postInfo = (params) => {
  return apiClient({
    url: "/post",
    method: "post",
    data: params,  // axios的post请求body用data
  });
};
export default {
  getInfo,
  postInfo,
};

App.vue:用于测试请求结果

<script>
import api from './api/index.js'
export default {
    data() {
        return {
            isH5: true
        }
    },
    created() {
        this.init()
    },
    methods: {
        init() {
            api.getInfo().then(res => {
                console.log(res.data);
            })
            api.postInfo({
                name: 'zhangsan',
                age: '18'
            }).then(res => {
                console.log(res.data);
            })
        }
    },
}
</script>

结果如下:
在这里插入图片描述
在这里插入图片描述

4. 总结

总结一部分区别如下:【这三个东西差别真的很大】

Ajaxfetchaxios
类型术语,技术的统称js内置的api第三方库
是否使用xhr二次封装
是否返回Promise

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/299176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为面经总结

为了帮助大家更好的应对面试&#xff0c;我整理了往年华为校招面试的题目&#xff0c;供大家参考~ 面经1 技术一面 自我介绍说下项目中的难点volatile和synchronized的区别&#xff0c; 问的比较细大顶堆小顶堆怎么删除根节点CSRF攻击是什么&#xff0c;怎么预防线程通信方式…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第三天-Linux进程练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

基于神经网络的手写汉字提取与书写评分系统研究

相关源码和文档获取请私聊QQ:3106089953 论文目录结构 目 录 摘 要 I Abstract II 目 录 IV 第1章 绪论 1 1.1. 研究背景与意义 1 1.2. 国内外研究现状 2 1.2.1. 文本定位技术研究现状 2 1.2.2. 手写汉字识别研究现状 3 1.2.3. 汉字书写质量评价方法研究现状 4 1.3. 本文所做工…

迁移数据mysql到clickhouse

场景&#xff1a; 项目上需要将mysql表中数据迁移到clickhouse。 理论&#xff1a; 借助MaterializeMySQL 说明&#xff1a; 首先该方案实施需要启动mysql的binlog配置否则同步不了&#xff0c;尽管MaterializeMySQL官方说是在实验阶段&#xff0c;不应该在生产上使用&#x…

numpy 广播

现在有两个数组分别为&#xff1a; arr1 [0, 1, 2, 3, 4, 5, 6]arr2 [1] 这两个数组可以进行广播吗&#xff1f; 二维数组广播&#xff1a; arr1 np.arange(0,3).reshape(1,3) array([[0, 1, 2]]) arr2 np.arange(4,7).reshape(3,1) array([[4],[5],[6]])这两个数组可以进行…

电脑单机游戏推荐:嗜血印 BLOODY SPELL 中文版

《嗜血印》该游戏的故事发生在一个充满秘密和恐怖的江湖中。一伙自称为“灵虚教”的神秘组织闯入万法归宗门派&#xff0c;导致天下大乱。妹妹小鲤被掳为人质&#xff0c;同门师兄弟相继遭到毒手。当嗜血咒印打开的那一刻&#xff0c;重识自我的苏夜锦&#xff0c;为了守护自己…

【linux】Ubuntu 22.04.3 LTS截屏

一、快捷键 交互式录屏 ShiftCtrltAltR 交互式截图 Print 对窗口进行截图 AltPrint 截图 ShiftPrint 快捷键可能取决于使用的桌面环境和个人的键盘快捷键设置。如果上述快捷键不起作用&#xff0c;可能需要检查系统设置中的键盘快捷键部分&#xff0c;以了解系统中截图的…

【MATLAB源码-第105期】基于matlab的4PAM调制解调仿真,输出误码率和误符号曲线并且和理论值对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 4PAM&#xff08;4-Pulse Amplitude Modulation&#xff0c;4脉冲幅度调制&#xff09;是一种数字调制技术&#xff0c;它通过改变载波信号的幅度来表示数据。在4PAM中&#xff0c;载波的幅度可以采用四种不同的水平&#xf…

AcWing 998. 起床困难综合症

原题链接 其实上面这一堆就是想说&#xff0c;输入 n,m以及 n 个数和该数所对应的运算&#xff0c;其中运算包括有 与、或、异或 三种&#xff0c;真正的问题就是在所有不大于 m 的数&#xff08;非负数&#xff09;中&#xff0c;对给定的 n 个数都按该数所对应的运算运算一遍…

visi 各版本安装指南

visi下载链接 https://pan.baidu.com/s/1WNksdiChCPebPvRRSVakOA?pwd0531 1.鼠标右键【visi2021(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 visi2021(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup VISI 2…

竞赛练一练 第27期:GESP和电子学会相关题目练习

GESP一级2023.03_小猫捉老鼠 1. 准备工作 (1)导入背景Room 2; (2)删除默认小猫角色,导入角色Mouse1、Cat 2。 2. 功能实现 (1)点击绿旗,老鼠出现在随机位置; (2)通过键盘的“↑”、“↓”、“←”、“→”键来控制小猫行走,每按一次,移动5步; (3)小猫在…

GoLang:gRPC协议的介绍以及详细教程,从Protocol开始

目录 ​编辑 引言 一、安装相关Go语言库和相关工具 1. 安装Go 2. 安装Protocol Buffers Compiler 2.1 Windows 2.1.1 下载 2.1.2 解压 2.1.3 环境变量 2. macOS 3. Linux 4. 验证安装 3. 安装gRPC-Go 4. 安装Protocol Buffers的Go插件 二、定义服务 三、生成Go…

论文笔记 Understanding Electricity-Theft Behavior via Multi-Source Data

WWW 2020 oral 1 INTRO 1.1 背景 1.1.1 窃电 窃电&#xff08;electricity theft&#xff09;指用户为了逃避电费而进行非法操作的一种行为 常用的反窃电方法可分为两类&#xff1a; 基于硬件驱动的反窃电方法 ​​​​​​​电表开盖检测、集中器检测。。。。 硬件驱动的…

腾讯云3年轻量应用服务器2核2G4M和2核4G5M性能测评

腾讯云优惠之轻量应用服务器3年优惠价格表&#xff0c;目前可以买三年的轻量配置为2核2G4M和2核4G5M&#xff0c;2核2G4M价格三年价格540元&#xff0c;2核4G5M带宽三年756元&#xff0c;当然也可以选择购买一年&#xff0c;第二年续费会比较贵&#xff0c;腾讯云轻量2核2G4M服…

多功能号卡推广分销管理系统 流量卡推广分销网站源码-目前市面上最优雅的号卡系统

一套完善,多功能,的号卡分销系统,多接口,包括运营商接口,无限三级代理,最简单易用的PHP~ 目前市面上最优雅的号卡系统!没有之一 软件架构说明 环境要求php7.3以上(建议低于8.0),MySQL5.6以上,Nginx1.16(无要求) 产品特性 自动安装向导 易于安装使用部署 多个第…

不是小米SU7买不起,而是17.58万的银河E8更有性价比

作者 |Amy 编辑 |德新 疯狂的2023年车市已过。这一年&#xff0c;新势力与传统车企自主品牌在新能源战略上多次交锋。 新能源汽车市场不再由新势力独领风骚&#xff0c;传统车企的新能源品牌进步迅猛&#xff0c;增长势头强劲。 以吉利汽车集团为例&#xff0c;2023年其新能…

1-01初识C语言

一、概述 C语言是贝尔实验室的Ken Thompson&#xff08;肯汤普逊&#xff09;、Dennis Ritchie&#xff08;丹尼斯里奇&#xff09;等人开发的UNIX 操作系统的“副产品”&#xff0c;诞生于1970年代初。 Thompson和Ritchie共同创作完成了Unix操作系统&#xff0c;他们都被称为…

解析数据链路层——组帧

组帧是数据链路层的重要功能之一&#xff0c;它将较长的数据分割成较小的帧以便在网络中传输。在本文中&#xff0c;我们将深入探讨组帧的概念、目的以及常见的组帧技术。 组帧是将数据封装成具有一定格式的帧的过程。帧是数据链路层传输的基本单位&#xff0c;它包含了有效数…

模糊综合评价

第一步&#xff1a;确定评价指标集 确定评语集&#xff1a;如好&#xff0c;很好 第二步&#xff1a;求出模糊评价矩阵P 其中Pij表示方案X在第i个指标处于第j级评语等等隶属度 并且在此阶段需要确认各指标的权系数向量A 第三步&#xff1a;利用矩阵的模糊乘法得到综合评价…

InternLM第2节课作业

基础作业 使用 InternLM-Chat-7B 模型生成 300 字的小故事 熟悉 hugging face 下载功能&#xff0c;使用 huggingface_hub python 包&#xff0c;下载 InternLM-20B 的 config.json 文件到本地