前端培训-中级阶段(9)-原生Ajax的运行原理与实现

简介: 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。ajax 对于现在的前端来说已经是一件必需品了。单页应用?前后端分离?远程搜索?异步加载?能做的功能太多了。当然,一直以来我们都是用一些封装好的api去使用(jQuery.ajax 、axios)。今天我们就来了解原生的Ajax。

Ajax是什么?


Asynchronous JavaScript + XML(异步JavaScript和XML), 其本身不是一种技术,而是一个在 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的‘新’方法,包括: HTML or XHTML, Cascading Style Sheets, JavaScript, The Document Object Model, XML, XSLT, 以及最重要的 XMLHttpRequest object。当使用结合了这些技术的AJAX模型以后, 网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面。这使得程序能够更快地回应用户的操作。


尽管X在Ajax中代表XML, 但由于JSON的许多优势,比如更加轻量以及作为Javascript的一部分,目前JSON的使用比XML更加普遍。JSON和XML都被用于在Ajax模型中打包信息。


Ajax的原理


浏览器发送请求 HttpRequest,服务器给出响应 HttpResponse。不同于正常打开页面的是,Ajax通常使用的数据需要二次加工


比如一首歌的歌曲信息,使用Ajax加载到之后,我们再通过一定的方式把数据显示在页面之上。


当然,我们的html页面,也是通过这样的原理展示的,只不过是浏览器去拉,然后解析html,渲染给我们看。


Ajax的优点


  1. 速度更快。同等条件下,降低了流量,减少了无用数据的加载。


  1. 流量少。一个html和一个json那个更小,我就不说了吧。


  1. 保持之前的界面不变化。比如说验证码,比如说异步加载等等。可以保留历史的输入。


Ajax的核心API


  1. XMLHttpRequest

a.var xhr= new XMLHttpRequest(); 创建一个XHR对象,用于发起请求


b.xhr.open('GET', 'https://www.lilnong.top/static/json/manifest.json'); 设置为GET请求,请求https://www.lilnong.top/stati...


c.xhr.send(); 发送请求。这个时候浏览器会开启一个线程去请求,回调函数会放在等待队列中。


d.回调函数

  1. onload
  2. onerror
  3. abort
  4. onreadystatechange


  1. Fetch


一个比 XHR 更的 API。支持 Promise,简直不要太爽。

fetch('https://www.lilnong.top/static/json/manifest.json')
     .then(response=>response.json())
     .then(data=>console.log(data));


XMLHttpRequest


之前我们已经大体的了解一下XHR,下面我们深入的介绍一下。测试地址,可以点按钮,然后看network中的请求


new 一个 XHR 对象


new XMLHttpRequest();无参


老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:new

ActiveXObject("Microsoft.XMLHTTP");。话说兼容ie,还不用jquery的人很少吧。


使用 XHR 对象发送请求


xhr = new XMLHttpRequest();
xhr.open("GET","https://www.lilnong.top/static/json/front-end.json",true);
xhr.send();


open(method,url,async)


设置一个请求


  1. methods为请求类型。参数如 GETPOSTPUTDELETEHEAD


  1. url为请求地址。


  1. async。true(异步) false(同步)。


send(params)


发送这个请求,如果是post的话,参数是body的内容。get的话,需要带在open的url上。


  1. 支持String


  1. FormData


  1. blob


设置请求头 setRequestHeader


xhr.setRequestHeader(key,value);


通常有几种情况我们需要设置。


  1. 上传
    setRequestHeader("Content-type","application/x-www-form-urlencoded");这样设置等于砸场子。肯定不支持。


那么常用的Content-type有什么呢?分别对应的数据是什么呢?留个作业吧(毕竟我之前写过)


  1. token 验证
    一般名字都是自定义的。登录的token。csrf 的 token。


响应


一般来说就是拿到 response 来处理了。因为这些都是和后端协商好的。JSON、XML、或者其他数据。


可以返回ArrayBuffer、Blob、Document、DOMString,具体是哪种类型取决于XMLHttpRequest.responseType的值。


readyState


每当 readyState 改变时,就会触发 onreadystatechange 事件。标明当前XHR的状态,onreadystatechange 事件被触发 4 次(0 - 4), 分别是: 0-1、1-2、2-3、3-4,对应着 readyState 的每个变化。


0: 请求未初始化

1: 服务器连接已建立

2: 请求已接收

3: 请求处理中

4: 请求已完成,且响应已就绪(status为返回的状态码)


回调


  1. onload 请求成功


  1. onerror 请求失败


  1. onreadystatechange readyState 改变时


  1. progress 下载进度


  1. .upload.progress 上传进度


  1. ontimeout 超时


  1. onabort 被终止


其他 属性&方法


  1. timeout
    unsigned long 即无符号长整型,表示该请求的最大请求时间(毫秒),超过该时间请求会自动结束。


  1. withCredentials
    Boolean,用来指定跨域的请求是否应该使用证书(如cookie或授权header头)。


  1. .abort()
    如果请求已经被发送,则立刻中止请求.


  1. .getResponseHeader()


返回包含指定响应头的字符串,如果响应尚未收到或响应中不存在该报头,则返回null。
可以用来拿服务器时间


fetch


fetch --mdn,感兴趣的可以去看看,我这里只简单介绍。毕竟这个api还需要发展。

但是promise真的好爽。写起来真的好短。支持的返回类型也好多。还有就是新的API基本都是想要跨平台(想想axios)。


Window 和 WorkerGlobalScope 都实现了 WorkerOrGlobalScope。——这意味着基本在任何场景下只要你想获取资源,都可以使用 位于 WorkerOrGlobalScope 中的 fetch() 方法

创建&发送


fetch(input[, init]);


input是你想要请求的资源。支持两种类型


  1. 一个 USVString 字符串,包含要获取资源的 URL。一些浏览器会接受 blob: 和 data: 作为 schemes.


  1. 一个 Request 对象。


init就是一些参数

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


  1. headers 请求的头信息,形式为 Headers 的对象或包含 ByteString 值的对象字面量。


  1. body 请求的 body 信息:可能是一个 Blob、BufferSource、FormData、URLSearchParams 或者 USVString 对象。注意 GET 或 HEAD 方法的请求不能包含 body 信息。


  1. 等等,还有好多,可以去MDN查看


HTTP response codes


附上MDN原文地址,我只列举一些常见的。


简单来说分为五类

  1. 1xx 消息响应


  1. 2xx 成功响应


  1. 3xx 重定向


  1. 4xx 客户端错误


  1. 5xx 服务器端错误


状态码 状态描述 详细描述 常见场景
200 OK (成功) 请求成功.成功的意义根据请求所使用的方法不同而不同.GET: 资源已被提取,并作为响应体传回客户端.HEAD: 实体头已作为响应头传回客户端.POST: 经过服务器处理客户端传来的数据,适合的资源作为响应体传回客户端.TRACE: 服务器收到请求消息作为响应体传回客户端.PUT、DELETE、OPTIONS 方法永远不会返回 200 状态码. 加载网页,加载资源,加载成功,可以说最常见
206 Partial Content (部分内容) 当客户端通过使用range头字段进行文件分段下载时使用该状态码 一般出现在大文件,比如MP4
301 Moved Permanently (永久移动) 该状态码表示所请求的URI资源路径已经改变,新的URL会在响应的Location:头字段里找到. 用于永久移动,比如说http跳转到https,比如想要更换域名。通常搜索引擎爬虫抓到301会替换保存的资源地址。
302 Found (临时移动) 该状态码表示所请求的URI资源路径临时改变,并且还可能继续改变.因此客户端在以后访问时还得继续使用该URI.新的URL会在响应的Location:头字段里找到 用于临时重定向,比如登录失效需要去登录页,比如作品目前在审核。
304 Not Modified(未修改) 告诉客户端,所请求的内容距离上次访问并没有变化. 客户端可以直接从浏览器缓存里获取该资源. 一般就是js被缓存,css被缓存。当然也有写get请求数据接口也会缓存。
400 Bad Request(错误请求) 因发送的请求语法错误,服务器无法正常读取. 一般来说都是body数据异常,比如服务端要params,body里面是JSON
401 Unauthorized(未授权) 需要身份验证后才能获取所请求的内容,类似于403错误.不同点是.401错误后,只要正确输入帐号密码,验证即可通过.
403 Forbidden(禁止访问) 客户端没有权利访问所请求内容,服务器拒绝本次请求. 通常都是token失效
404 Not Found(未找到) 服务器找不到所请求的资源.由于经常发生此种情况,所以该状态码在上网时是非常常见的. 接口未定义,资源不存在
500 Internal Server Error (内部服务器错误) 服务器遇到未知的无法解决的问题.
501 Implemented (未实现) 服务器不支持该请求中使用的方法,比如POST 和 PUT.只有GET 和 HEAD 是RFC2616规范中规定服务器必须实现的方法.
502 Bad Gateway (网关错误) 服务器作为网关且从上游服务器获取到了一个无效的HTTP响应.
503 Service Unavailable (服务不可用) 由于临时的服务器维护或者过载,服务器当前无法处理请求.这个状况是临时的,并且将在一段时间以后恢复.如果能够预计延迟时间,那么响应中可以包含一个Retry-After:头用以标明这个延迟时间.如果没有给出这个Retry-After:信息,那么客户端应当以处理500响应的方式处理它.同时,这种情况下,一个友好的用于解释服务器出现问题的页面应当被返回,并且,缓存相关的HTTP头信息也应该包含,因为通常这种错误提示网页不应当被客户端缓存.
504 Gateway Timeout (网关超时) 服务器作为网关且不能从上游服务器及时的得到响应返回给客户端.


相关文章
|
缓存 前端开发 JavaScript
前端开发的必修课:如何让你的网页在弱网环境下依然流畅运行?
【10月更文挑战第30天】随着移动互联网的普及,弱网环境下的网页性能优化变得尤为重要。本文详细介绍了如何通过了解网络状况、优化资源加载、减少HTTP请求、调整弱网参数和代码优化等方法,提升网页在弱网环境下的加载速度和流畅性,从而改善用户体验。
977 4
|
前端开发 应用服务中间件 nginx
docker安装nginx,前端项目运行
通过上述步骤,你可以轻松地在Docker中部署Nginx并运行前端项目。这种方法不仅简化了部署流程,还确保了环境的一致性,提高了开发和运维的效率。确保按步骤操作,并根据项目的具体需求进行相应的配置调整。
1633 25
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
2297 1
|
前端开发 JavaScript 程序员
成功解决:尚硅谷中的谷粒商城前端项目运行依赖问题。【详细图解+问题说明+解决思路】
这篇文章介绍了如何解决尚硅谷谷粒商城前端项目中遇到的依赖问题,通过修改`package.json`和`package-lock.json`中的`node-sass`和`sass-loader`版本,成功解决了node版本与这些依赖的兼容性问题。
成功解决:尚硅谷中的谷粒商城前端项目运行依赖问题。【详细图解+问题说明+解决思路】
|
XML 前端开发 JavaScript
ajax运行原理
AJAX(Asynchronous JavaScript and XML)是一种使网页能够在不重新加载整个页面的情况下与服务器异步通信的技术。尽管名字中有“XML”,但它支持多种数据格式,如JSON、HTML和纯文本。用户行为触发AJAX请求后,通过创建`XMLHttpRequest`对象或使用现代浏览器中的`fetch` API来配置并发送HTTP请求。请求完成后,可以通过回调函数处理服务器返回的数据,更新网页内容。现代JavaScript推荐使用更简洁强大的`fetch` API来实现AJAX功能,广泛应用于动态网页和单页应用中,提升用户体验。
|
NoSQL 前端开发 MongoDB
前端的全栈之路Meteor篇(三):运行在浏览器端的NoSQL数据库副本-MiniMongo介绍及其前后端数据实时同步示例
MiniMongo 是 Meteor 框架中的客户端数据库组件,模拟了 MongoDB 的核心功能,允许前端开发者使用类似 MongoDB 的 API 进行数据操作。通过 Meteor 的数据同步机制,MiniMongo 与服务器端的 MongoDB 实现实时数据同步,确保数据一致性,支持发布/订阅模型和响应式数据源,适用于实时聊天、项目管理和协作工具等应用场景。
603 0
|
数据采集 前端开发 JavaScript
Python爬虫之Ajax数据爬取基本原理#6
Ajax数据爬取原理【2月更文挑战第19天】
534 1
Python爬虫之Ajax数据爬取基本原理#6
|
前端开发 JavaScript 开发者
JSF与WebSockets,打造实时通信魔法!让你的Web应用秒变聊天室,用户体验飞升!
【8月更文挑战第31天】在现代Web应用开发中,实时通信对于提升用户体验至关重要。本文探讨了如何在主要面向Web应用开发的JSF(JavaServer Faces)框架中引入WebSockets支持,以实现客户端与服务器之间的全双工通信。通过具体示例展示了在JSF应用中实现WebSockets的基本步骤:添加依赖、创建服务器端点以及在前端页面中嵌入JavaScript客户端代码。尽管这一过程中可能会遇到一些挑战,如复杂代码编写和额外配置需求,但借助AWS等云服务平台,开发者仍能高效地完成部署和管理工作,从而增强Web应用的实时通信能力。
296 0
|
前端开发 JavaScript 开发者
Angular状态管理神器ngrx Store:从零开始的实践指南与进阶优化秘籍,让你的前端应用状态井井有条、高效运行的绝招大揭秘
【8月更文挑战第31天】状态管理在现代Web应用开发中至关重要,特别是在构建大型、复杂的Angular应用时。ngrx Store借鉴Redux的设计理念,提供集中式状态管理和可预测的数据流,有助于增强应用的可维护性和可测试性。
638 0

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    1262
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    572
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    434
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    436
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    549
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    728
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    1414
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    315
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    1168
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    509