【实例】Ajax、Axios、Fetch区别

文章目录

Ajax、Axios、Fetch区别

Ajax

Ajax 是 js 异步技术的术语,Asynchronous JavaScript and XML,是一个概念一种思想,XMLHttpRequest 是最早实现 Ajax 一种技术。

XMLHttpRequest流程(用XHR实现Ajax)
复制代码
function ajax() {
  // 创建 XHR 实例
  const xhr = new XMLHttpRequest();
  // 通过 XHR 的 open 设置请求方式 GET/POST 及请求的 URL 等。第三个参数是指定在等待服务器返回信息的时间内是否继续执行下面的代码。默认为 true 不会。
  xhr.open("get", url, false);
  // 通过 XHR 的 onreadystatechange 挂载回调函数。
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
      if (xhr.status === 200) {
        console.log("结果", xhr.response)
      }
    }
  }
  // 通过 XHR 的 send 方法向服务器发送请求。
  xhr.send(null);
}
ajax('https//xxxxx/api/data')

readyState 返回一个 XHR 代理当前所处的状态,总是处于下列状态中的一个:

0 UNSENT 代理被创建,但尚未调用open()方法。

1 OPENED open()方法已经被调用。

2 HEADERS_RECEIVED send() 方法已经被调用,并且头部和状态已经可获得。

3 LOADING 下载中; responseText 属性已经包含部分数据。

4 DONE 下载操作已完成

Axios

Axios 是一个第三方库,它内部可以用 XMLHttpRequest 或 fetch 实现。它提供了更高级别的封装及功能。支持 Promise API。

复制代码
import axios from 'axios';

axios.post('https://example.com/api/endpoint', postData)
  .then((response) => {
    console.log('Response:', response.data);
  })
  .catch((error) => {
    console.error('Error:', error);
  });

Fetch

Fetch 是 ES6 新出来的基于 Promise 的异步请求 API,和 XHR 一样都是官方 API。

复制代码
const requestOptions = {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(postData)
};

fetch('https://example.com/api/endpoint', requestOptions)
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json();
  })
  .then(data => {
    console.log('Response:', data);
  })
  .catch(error => {
    console.error('Error:', error);
  });

fetch接受两个参数:

URL (Uniform Resource Locator): 请求的目标地址

Options:

method: 请求的方法,如GET、POST、PUT、DELETE等。

headers: 请求头,包含了发送给服务器的信息,比如Content-Type、Authorization等。

body: 请求体,包含了发送给服务器的数据,通常用于POST、PUT等需要发送数据的请求方法。

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

credentials: 请求的凭证,例如include、same-origin、omit。

cache: 请求的缓存模式,例如default、no-store、reload等。

返回:

响应状态 Response Status: 表示请求的结果的状态码,例如200表示成功,404表示资源未找到,500表示服务器内部错误等。

响应头 Response Headers: 包含了服务器返回的元信息,如Content-Type、Content-Length等。

响应体 Response Body: 包含了服务器返回的实际数据。可以是文本数据、JSON数据、二进制数据等。如果响应是JSON格式的,可以使用.json()方法来解析响应体为JavaScript对象。对于文本数据,可以直接通过.text()方法;对于二进制数据,可以通过.blob()方法获取。

Fetch的封装

项目里的一些例子 已脱敏

请求部分

复制代码
// 可以对请求字段进行检验和补充
if (options.body && !options.method) options.method = 'POST';
if (options.method) options.method = options.method.toUpperCase();

// 对跨域请求进行处理 拼接 CSRF-TOKEN 等
if (!options.credentials) options.credentials = 'include';
const csrfTokenMethod = ['POST', 'PUT', 'DELETE', 'PATCH'];
if (csrfTokenMethod.includes(options.method)) {
  init.headers = Object.assign({}, options.headers, {
    'CSRF-TOKEN': getCookie('CSRF-TOKEN'),
  });
}
// 拼接URL等业务需求

// 包裹返回处理函数
return fetch(url, options).then(resFilter);

返回部分

复制代码
// 错误的处理
return res.json().then((body) => {
  if (res.status !== 200) {
    const error = body;

    if (error.errorCode === EErrorCode.AAA) return null;
    if (error.errorCode === EErrorCode.BBB) {
      window.location.href = Routers.HOME;
      return;
    }

    browserNotify({
      title: error.errorDescription,
      message: renderErrorMessage(error),
      btnLabel: 'Copy',
      handler: () => copyStringToClipboard(renderErrorMessage(error)),
    });
    throw error.message;
  }

  return body;
});

总结

ajax 是一种技术思想,不是具体的 API 和库,最早的实现有 XHR。

fetch 是 ES6 新的异步请求 API。

axios 是第三方库。

相关推荐
Laravel技术社区10 分钟前
用PHP8实现斗地主游戏,实现三带一,三带二,四带二,顺子,王炸功能(第二集)
前端·游戏·php
m0_738120721 小时前
应急响应——知攻善防Web-3靶机详细教程
服务器·前端·网络·安全·web安全·php
程序员爱钓鱼8 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
PineappleCoder8 小时前
工程化必备!SVG 雪碧图的最佳实践:ID 引用 + 缓存友好,无需手动算坐标
前端·性能优化
JIngJaneIL9 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
敲敲了个代码9 小时前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web
澄江静如练_9 小时前
列表渲染(v-for)
前端·javascript·vue.js
JustHappy10 小时前
「chrome extensions🛠️」我写了一个超级简单的浏览器插件Vue开发模板
前端·javascript·github
Loo国昌10 小时前
Vue 3 前端工程化:架构、核心原理与生产实践
前端·vue.js·架构