ajax,axios,fetch

文章目录

  • ajax
    • 工作原理
    • ajax发请求四个步骤
      • 创建xmlhttprequest对象
      • 设置请求方式
      • 设置回调函数
      • 发送请求
    • 自封装ajax
  • axios
    • axios 特性
    • 如何用
    • 配置拦截器
    • fetch
  • 三者区别

ajax

工作原理

Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器。像—些数据验证和数据处理等都交给Ajax引擎自己来做,,只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。

ajax发请求四个步骤

创建xmlhttprequest对象

//第一步:创建XMLHttpRequest对象
 
var xmlHttp;
if (window.XMLHttpRequest) {            //非IE
    xmlHttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {       //IE
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP")
}

设置请求方式


xmlHttp.open("POST", url, true);

设置回调函数

//第三步:注册回调函数
 
xmlHttp.onreadystatechange = function() {
    if (xmlHttp.readyState == 4) {
        if (xmlHttp.status == 200) {
            ......
        } else {
            ......
        }
    }
}

xmlHttp.readyState是存有XMLHttpRequest 的状态。从 0 到 4 发生变化。0: 请求未初始化。1: 服务器连接已建立。2: 请求已接收。3: 请求处理中。4: 请求已完成,且响应已就绪

具体状态码如下:
AJAX状态码说明
1**:请求收到,继续处理
2**:操作成功收到,分析、接受
3**:完成此请求必须进一步处理
4**:请求包含一个错误语法或不能完成
5**:服务器执行一个完全有效请求失败

再具体就如下:

100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户访问其他URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除
400——错误请求,如语法错误
401——请求授权失败
402——保留有效ChargeTo头响应
403——请求不允许
404——没有发现文件、查询或URl
405——用户在Request-Line字段定义的方法不允许
406——根据用户发送的Accept拖,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求
500——服务器产生内部错误
501——服务器不支持请求的函数
502——服务器暂时不可用,有时是为了防止发生系统过载
503——服务器过载或暂停维修
504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长
505——服务器不支持或拒绝支请求头中指定的HTTP版本

发送请求

xmlHttp.send(params)

自封装ajax

封装get方法

 let Aget={
            createXHR: function(){
                if(window.XMLHttpRequest){
                    return new XMLHttpRequest()
                }else{
                    return new ActiveXObject()
                }
            },
            get:function(url,data,callback,dataType){
                //避免dataType大小写
                let dataType = dataType.toLowerCase()
                if(data){
                    url+='?'
                    Object.keys(data).forEach(key => url+=`${key}=${data[key]}&`)
                    url=url.slice(0,-1)
                }

                let xhr=this.createXHR()
                //创建请求
                xhr.open('get',url)
                //发送请求
                xhr.send()
                xhr.onreadystatechange = function(){
                    if(xhr.readyState==4){
                        if(xhr.status>=200&&xhr.status<300||xhr.status==304){
                            let res = dataType=='json'? JSON.parse(xhr.responseText) : xhr.responseText

                            callback(res,xhr.status,xhr)
                        }
                    }
                }

            }
        }

封装post方法

 let Pget={
            createXHR: function(){
                if(window.XMLHttpRequest){
                    return new XMLHttpRequest()
                }else{
                    return new ActiveXObject()
                }
            },
            get:function(url,data,callback,dataType){
                //避免dataType大小写
                let dataType = dataType.toLowerCase()
                let xhr=this.createXHR()
                let str=''
                if(data){
                    Object.keys(data).forEach(key => str+=`${key}=${data[key]}&`)
                    str=str.slice(0,-1)
                }
                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
                
                //发送请求
                xhr.send(str)
                xhr.onreadystatechange = function(){
                    if(xhr.readyState==4){
                        if(xhr.status>=200&&xhr.status<300||xhr.status==304){
                            let res = dataType=='json'? JSON.parse(xhr.responseText) : xhr.responseText

                            callback(res,xhr.status,xhr)
                        }
                    }
                }

            }
        }
       

封装请求

 let aj={
            createXHR: function(){
                if(window.XMLHttpRequest){
                    return new XMLHttpRequest()
                } else{
                    return new ActiveXObject()
                }
            },
            ajax:function(params){
                let type = params.type ? params.toLowerCase() :'get'
                let isAsync=params.isAsync? params.isAsync : 'true'
                let url=params.url
                let data= params.data ? params.data :{}
                let dataType = params.dataType.toLowerCase()

                let xhr=createXHR()

                let str=''
                Object.keys(data).forEach(key=>str+=`${key}=${data[key]}&`)
                if(type==='get') url+=`?${str}`
                return new Promise((resolve, reject) => {
                    xhr.open(type,url,isAsync)

                    if (type=='post'){
                        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
                        xhr.send(str)
                    }else{
                        xhr.send()
                    }
                    xhr.onreadystatechange=function(){
                        if(xhr.readyState==4){
                            if(xhr.status==200&&xhr.status<300|| xhr.status==304){
                               let res=dataType==='json'? JSON.parse(responseText): responseText 
                               resolve(res)
                            }else{
                                reject(xhr.status)
                            }
                        }
                    }


                })
                

            }

        }

axios

axios 特性

基于promise的异步ajax请求库
浏览器端/node端都可以使用
支持请求/响应拦截器
支持请求取消
请求/响应数据转换
批量发送多个请求

如何用

const axios = require('axios');

// 向给定ID的用户发起请求
axios.get('/user?ID=12345')
  .then(function (response) {
    // 处理成功情况
    console.log(response);
  })
  .catch(function (error) {
    // 处理错误情况
    console.log(error);
  })
  .finally(function () {
    // 总是会执行
  });

// 上述请求也可以按以下方式完成(可选)
axios.get('/user', {
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  })
  .finally(function () {
    // 总是会执行
  });  

// 支持async/await用法
async function getUser() {
  try {
    const response = await axios.get('/user?ID=12345');
    console.log(response);
  } catch (error) {
    console.error(error);
  }
}

配置拦截器

const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });

fetch

Fetch 是在 ES6 出现的,它使用了 ES6 提出的 promise 对象。它是 XMLHttpRequest 的替代品。
很多小伙伴会把它与 Ajax 作比较,其实这是不对的,我们通常所说的 Ajax 是指使用 XMLHttpRequest 实现的 Ajax,所以真正应该和 XMLHttpRequest 作比较。

Fetch 是一个 API,它是真实存在的,它是基于 promise 的。

特点:

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

所以这里就和 Ajax 又很大不同了,一个是思想,一个是真实存在的 API,不过它们都是用来给网络请求服务的,我们一起来看看利用 Fetch 实现网络请求。

<body>
  <script>
    function ajaxFetch(url) {
      fetch(url).then(res => res.json()).then(data => {
        console.info(data)
      })
    }
    ajaxFetch('https://smallpig.site/api/category/getCategory')
  </script>
</body>


三者区别

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

MFC 常用控件

目录 一、控件的交互方式 二、CButton/CheckBox/RadioButton 三、EditControl 四、ListBox 五、ComBox 六、Progress/Timer 七、PictureController 八、ListControl 九、Tree 一、控件的交互方式 得到控件的类的对象&#xff0c;就可以通过这个对象来操作类 CWnd* G…

Spring Framework 6.1 正式 GA

Spring Framework 6.1在运行时方面针对 JDK 21 和 Jakarta EE 10 上提供了一级支持&#xff0c;同时保留了 JDK 17 和 Jakarta EE 9 基线。Spring 还通过精细的元数据推理跟踪 GraalVM for JDK 21 的演变&#xff0c;同时暂时保持与 GraalVM 22.3 的兼容性。 主要变化 支持 JD…

解决终端自暂停的问题 关闭快速编辑模式 python代码暂停

问题描述&#xff1a; 在windows10终端中运行的python出现自暂停或者是点击鼠标后出现暂停&#xff0c;敲回车或空格它才继续运行。 解决方法 注意&#xff1a;windows不能针对所有命令行统一设置&#xff0c;只能单个程序去设置。 半永久 在终端右键点击属性 取消勾选快速…

自注意力机制理解

当理解自注意力机制时&#xff0c;可以想象一个句子级别的文本输入作为示例。假设我们有以下句子&#xff1a;“The cat is eating fish”。现在我们将这个句子转换成词嵌入向量序列&#xff1a; (给定有值的只是示例&#xff0c;方便理解&#xff0c;以下都是这样&#xff09…

clion2020 中文版安装

一 程序安装 安装包地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1EJsmgmZcCQHoKDECkxmeaw?pwd1111 提取码&#xff1a;1111

C++构造函数和析构函数

构造函数和析构函数的由来 手机有出厂设置&#xff0c;在不用这个手机的时候我们也会清理这个手机的隐私内容。C面向对象的思想来源于生活&#xff0c; 每个对象也应该有初始设置 和 对象销毁前要清理个人隐私数据。 类的构造函数对应于手机的初始化。 类的析构函数对应于手机…

【开源】基于Vue.js的音乐偏好度推荐系统的设计和实现

项目编号&#xff1a; S 012 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S012&#xff0c;文末获取源码。} 项目编号&#xff1a;S012&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 音乐档案模块2.1…

PHP 中传值与传引用的区别,什么时候传值什么时候传引用?

传值&#xff1a;当使用传值的方式时&#xff0c;函数或方法会创建原始变量的一个副本&#xff0c;并将该副本传递给函数或方法。在函数或方法内部&#xff0c;对副本的任何修改都不会影响到原始变量。当函数或方法执行完毕后&#xff0c;副本被销毁&#xff0c;不再使用。 传引…

【入门篇】1.5 redis 客户端Jedis和Lettuce对比详解

文章目录 0. 前言1. Lettuce 与Jedis 对比2.详解2.1 线程安全2.2 阻塞/非阻塞2.3 集群支持2.4 PUB/SUB模型2.5 二进制协议 3. 参考资料 0. 前言 对于Java开发者来说&#xff0c;Jedis和Lettuce是两种非常常见的Redis客户端&#xff0c;他们可以帮助开发者更容易地在Java应用中…

多媒体ffmpeg学习教程

多媒体ffmpeg 目前比较流行的音视频文件为:MP4 flv m3u8 ffmpeg ffmpeg ffplay ffprobe ffserverffmpeg -i INPUT -vf "split [main][tmp]; [tmp] cropiw:ih/2:0:0, vflip [flip];[main][flip] overlay0:H/2" OUTPUTffmpeg -i 2022.mp4 -vcodec mpeg4 -b:…

YOLO目标检测——无人机检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;无人机识别数据集说明&#xff1a;无人机检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三种格式标签…

软件安利——火绒安全

近年来&#xff0c;以优化、驱动、管理为目标所打造的软件屡见不鲜&#xff0c;大同小异的电脑管家相继走入了公众的视野。然而&#xff0c;在这日益急功近利的社会氛围驱动之下&#xff0c;真正坚持初心、优先考虑用户体验的电脑管家逐渐湮没在了浪潮之中。无论是鲁大师&#…

2023年【P气瓶充装】报名考试及P气瓶充装复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年P气瓶充装报名考试为正在备考P气瓶充装操作证的学员准备的理论考试专题&#xff0c;每个月更新的P气瓶充装复审考试祝您顺利通过P气瓶充装考试。 1、【多选题】充装过程中出现充气头漏气的主要原因为&#xff1…

python 对图像进行聚类分析

import cv2 import numpy as np from sklearn.cluster import KMeans import time# 中文路径读取 def cv_imread(filePath, cv2_falgcv2.COLOR_BGR2RGB): cv_img cv2.imdecode(np.fromfile(filePath, dtypenp.uint8), cv2_falg) return cv_img# 自定义装饰器计算时间 def…

C++知识点总结(6):高精度乘法

一、高精度数 低精度数 1. 输入两个数字 char a_str[1005] {}; long long b; cin >> a_str >> b; 2. 将高精度数转换为整型 int a[1005] {}; int len_a strlen(a_str); for (int i 0; i < len_a-1; i) {a[len_a-i-1] a_str[i] - 48; } 3. 计算 int …

2.3 调用智谱 API

调用智谱 API 1 申请调用权限2 调用智谱 AI API3 使用 LangChain 调用智谱 AI参考&#xff1a; 智谱 AI 是由清华大学计算机系技术成果转化而来的公司&#xff0c;致力于打造新一代认知智能通用模型。公司合作研发了双语千亿级超大规模预训练模型 GLM-130B&#xff0c;并构建了…

【Python】Loguru模块更简洁的日志记录库

Loguru: 更优雅的日志记录解决方案&#xff01; loguru 是一个Python 简易且强大的第三方日志记录库&#xff0c;该库旨在通过添加一系列有用的功能来解决标准记录器的注意事项&#xff0c;从而减少 Python 日志记录的痛苦。 使用自带自带的 logging 模块的话&#xff0c;则需要…

机器学习笔记 - 使用 PyTorch 的多任务学习和 HydraNet

一、HydraNet简述 特斯拉使用了一个模型可以解决他们正在处理的每一项可能的任务。 例如:物体检测、道路曲线估计、深度估计、3D重建、视频分析、物体追踪、ETC等等。 以下是在 NVIDIA GPU 上以 3 种不同配置运行的 2 个计算机视觉模型的基准测试。 在第一个配置中,我…

柯桥会计培训|中级会计职称,考过中级,可以从事哪些工作?

拿下中级会计证书后&#xff0c;可以从事哪些工作呢&#xff1f;一起来看看吧~ 财务经理 财务经理可以说是会计人梦寐以求的岗位&#xff0c;上可以和老板畅聊公司财务情况&#xff0c;下可以管理整个财务部。但是在财务管理水平日益成为企业核心竞争力的今天&#xff0c;企业…

软件工程--软件过程学习笔记

本篇内容是对学校软件工程课堂内容的记录总结&#xff0c;部分也来源于网上查找的资料 软件过程基础 软件过程是指在软件开发过程中&#xff0c;经过一系列有序的步骤和活动&#xff0c;从问题定义到最终软件产品交付和维护的全过程。这个过程旨在确保软件项目能够按时、按预…