当前位置: 首页 > news >正文

【H2O2|全栈】JS进阶知识(四)Ajax

目录

前言

开篇语

准备工作

基本概念

原生JS使用AJAX

创建AJAX对象

设置请求方式和地址

设置请求头

发送请求

get方式发送

post方式发送

获取响应数据

AJAX状态码和HTTP状态消息

错误捕获

原生JS封装AJAX方法

$ 调用AJAX方法

结束语


前言

开篇语

本系列博客主要分享JavaScript的进阶语法知识,本期为第三期,主要分享的内容为AJAX请求的基本使用步骤以及原生、jQuery的AJAX封装方法。

从进阶部分开始,我们将脱离原生的JS,使用一些包装的第三方库来完成我们的需求。这些JS库需要在文档的开头引入,暂时的引入格式为script标签加src地址。

与基础部分的语法相比,进阶部分的语法会有较大的差别,注意最好不要混用原生方法与第三方库内容,以免出现不必要的麻烦。

准备工作

软件:【参考版本】Visual Studio Code

插件(扩展包):Open in browser, Live Preview, Live Server, Tencent Cloud AI Code Assistant, htmltagwrap

提示:在不熟练的阶段建议关闭AI助手

第三方JS库:jquery.min.js

提示:请站内搜索下载、引入方式

浏览器版本:Chrome

系统版本: Win10/11/其他非Windows版本

基本概念

AJAX,全名async javascript and XML,中文翻译为“异步JavaScript和XML”。

它是一种使用现有编程语言的新方法,通常用于在不重新加载整个界面的情况下,与服务器后端交换数据并在前端进行部分页面的重新渲染

AJAX默认执行异步机制,即async = true,该参数为false时执行同步操作。

原生JS使用AJAX

创建AJAX对象

原生JS使用AJAX的构造函数创建其对象,它的构造函数为XMLHttpRequest(),中文为可扩展标记语言超文本传输协议请求

创建一个AJAX对象的示例代码如下——

var xhr = new XMLHttpRequest()

设置请求方式和地址

AJAX使用open()方法,告诉AJAX对象以什么方式传输数据,向什么地方发送

发送请求的示例代码如下——

xhr.open("get", "http://localhost:8080/xxx/xxx")

其中,传输方式可以是get,也可以是post。

它们的区别如下——

  • get的参数在url后面 ,而post放在虚拟载体里面;
  • get有大小限制(只能提交少量参数);
  • post在安全性稳定性上比get更强;
  • 应用不同 ,get用于请求数据,post用于提交数据。

设置请求头

请求头相当于一个识别令牌,拥有自己的类型(指定头部)和给服务器识别的口令(提供的值)。

设置请求头的示例代码如下——

xhr.setRequestHeader(key, value)

常见的头部类型有——

类型作用

Authentication(认证)

用于系统进行身份/用户验证的凭据
Authorization(授权)顺序上在认证之后,不同的用户提供对应的访问系统的权限

特别的,对于POST类型数据,还需要在key处单独设置Content-type,即设置发送数据的格式

此时,对应的值类型如下——

数据类型
application/json发送json数据
application/x-www-form-urlencoded发送表单数据
text/plain发送纯文本
text/html发送html文本

比如,我们需要设置发送表单类型的数据,就可以像下面这样——

xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') 

发送请求

接下来,我们需要用send()向服务器发送我们设置好的请求信息。

get方式发送

使用该方式发送请求时,我们需要在open()中的url地址的 后拼接需要传输的数据内容。

拼接的字符串通常为下面的格式——

'http://xxx/xxx/xxx?key1=value1&key2=value2&...'

然后,我们就可以直接使用AJAX对象发送请求了——

xhr.send() 

post方式发送

除了在请求头中声明参数类型之外,post()方式需要设置发送的数据字符串。

拼接参数的实示例代码如下——

var parmas = "key1=" + value1 + "&key2=" + value2

这里我们就不需要把字符串拼到open()里的url中了。

发送请求时,直接将数据字符串放入send()——

xhr.send(parmas) 

注意,post方式传递的数据通常为对象格式的字符串,即——

"{

        'key1': 'value1',

        'key2': 'value2'

}"

获取响应数据

当我们需要获取服务器传来的数据时,有两种事件供我们选择——

事件作用

onload

加载服务端响应数据
onreadystatechange

侦测 Ajax 状态码并在条件符合时返回数据

用onload方式时,我们直接获取数据字符串即可。

使用xhr的responseText属性获取数据字符串,注意,如果我们需要其中的数据,还得将这个对象格式的字符串转为真正的对象。

在之前的博客中,我们提到了可以使用JSON.parse()方法解析对象格式字符串,因此我们可以用类似下面的方式来获取需要的数据——

var obj = JSON.parse(xhr.responseText)

AJAX状态码和HTTP状态消息

而对于onreadystatechange方式,即检查状态码改变的方式,我们需要用到xhr的readyState属性我们首先需要了解一个请求的五种状态码——

状态码状态
0

请求未初始化(还没有调用open())

1

请求已经建立,但是还没有发送(还没有调用send())

2

请求已经发送

3

请求正在处理中,通常响应中已经有部分数据可以用了

4

响应已经完成,可以获取并使用服务器的响应了

在到达onreadystatechange这一步之后,至少也是2即以后的状态了,当状态码为4时,接收数据即可。

判断和获取的示例代码如下——

if (xhr.readyState == 4) {

        var obj = JSON.parse(xhr.responseText)

        console.log(obj);

}

此外,还有一种http状态消息也可以用来判断请求是否成功,比如我们常见的404错误,就是一种状态消息。

一般来说,这个数值在[200, 300)的区间内,说明请求是成功的。

常见的状态消息如下——

消息含义

200

请求已成功,请求所希望的响应头或数据体将随此响应返回

302

请求的资源临时从不同的 URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的

304

如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾

403

服务器已经理解请求,但是拒绝执行

404

请求失败,请求所希望得到的资源未被在服务器上发现

500

服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现

错误捕获

使用onerror方式,来捕获接收数据过程中发生的错误(如网络中断等) ——

xhr.onerror = function () {

        // 提示错误信息

}

这里的错误消息也可以是报告HTTP状态消息中的错误类型。

原生JS封装AJAX方法

回顾一下使用AJAX请求数据的全过程,总结起来无非就是下面几步——

  1. 创建AJAX对象                                 var xhr = new XMLHttpRequest()
  2. 设置请求方式和地址                        xhr.open('way', 'url')   
  3. 设置请求头                                      xhr.setRequestHeader(key, headers[key])
  4. POST请求时,需要设置请求体       xhr.setRequestHeader('Content-Type', 'xxx')

  5. 发送请求                                          xhr.send() / xhr.send(parmas)

  6. 请求状态检查

那么,我们就可以使用一种方式,将上述过程封装起来,每当我们需要使用AJAX请求时,就调用这个函数。

一个示例的封装函数代码如下——

function ajax(url, method = 'GET', data = null, headers = {}, onSuccess = null, onError = null) {const xhr = new XMLHttpRequest();xhr.open(method, url, true);// 设置请求头  for (let key in headers) {xhr.setRequestHeader(key, headers[key]);}xhr.onload = function () {if (this.status >= 200 && this.status < 300) {// 请求成功  if (onSuccess) {onSuccess(this.responseText, this.status, this);}} else {// 请求失败  if (onError) {onError(this.status, this.statusText, this);}}};// 发送POST请求时,需要设置请求体  if (method === 'POST' && data) {xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.send(typeof data === 'string' ? data : Object.keys(data).map(key => encodeURIComponent(key) + '=' + encodeURIComponent(data[key])).join('&'));} else {xhr.send();}}

data处可以填待传输的数据对象,一般是get方式时填null,post方式时填需要传输的对象。

headers为请求头设置,如果为get方式,则直接按照对象的方式设置即可,比如——

{Authorization: 'aaaaa...'} 

如果为post方式,需要写成对象格式字符串——

 {'Authorization': 'aaaaa...'} 

onSuccess和onError处分别填成功和失败时调用的函数。

$ 调用AJAX方法

$ 对AJAX进行了函数封装,格式和我们上述的封装几乎一致——

$.ajax({

               type:请求方式的格式  get  post

               url:请求的地址

               async:是否是异步,默认表示异步

               data:发送到服务器的数据

               dataType:预期服务器返回的数据类型 json text

               headers:设置请求头

               success:请求成功时调用此函数

               error:请求失败时调用此函数

        })

结束语

本期内容到此结束。关于本系列的其他博客,可以查看我的JS进阶专栏。

在全栈领域,博主也只不过是一个普通的萌新而已。本系列的博客主要是记录一下自己学习的一些经历,然后把自己领悟到的一些东西总结一下,分享给大家。

文章全篇的操作过程都是笔者亲自操作完成的,一些定义性的文字加入了笔者自己的很多理解在里面,所以仅供参考。如果有说的不对的地方,还请谅解。

==期待与你在下一期博客中再次相遇==

——临期的【H2O2】

 

相关文章:

【H2O2|全栈】JS进阶知识(四)Ajax

目录 前言 开篇语 准备工作 基本概念 原生JS使用AJAX 创建AJAX对象 设置请求方式和地址 设置请求头 发送请求 get方式发送 post方式发送 获取响应数据 AJAX状态码和HTTP状态消息 错误捕获 原生JS封装AJAX方法 $ 调用AJAX方法 结束语 前言 开篇语 本系列博客…...

Spring IOC的工作流程

Spring IOC的工作流程 好的&#xff0c;这个问题我会从几个方面来回答。 IOC是什么 Bean的声明方式 IOC的工作流程 IOC的全称是 Inversion Of Control,也就是控制反转&#xff0c;它的核心思想是把对象的管理权限交给容器。&#xff08;展示图 1&#xff09; &…...

从新手到专家:7款电脑平面设计软件评测

平面设计在时尚、广告等多个领域扮演着重要角色&#xff0c;而创作出独特且富有创意的设计作品则需要依赖优秀的电脑平面设计软件。市场上的电脑平面设计软件众多&#xff0c;每款软件都有其独到之处。本文将为你推荐几款值得关注的电脑平面设计软件&#xff0c;并分析它们的特…...

【C++】如何让C++字符串更快、C++的小字符串优化

二十三、如何让C字符串更快、C的小字符串优化 1、如何让C字符串更快&#xff1f; 如果程序中有很多字符串操作&#xff0c;比如格式化文本(日志记录)&#xff0c;那是非常糟糕的&#xff0c;因为字符串操作是很慢的。字符串string和它相关的很多函数很可能会自动分配内存&…...

C++《list》

在本篇当中我们将学习STL中的list&#xff0c;在此list就是我们之前在数据结构学习过的链表&#xff0c;在本篇中我们要来了解list当中的成员函数该如何使用&#xff0c;由于list各个函数的接口和之前学习过的vector类型&#xff0c;因此在学习list的使用就较为轻松。在lis篇章…...

strongswan中METHOD定义

strongswan中使用METHOD来定义函数&#xff08;方法&#xff09;&#xff0c;如下get_first函数定义。 METHOD(linked_list_t, get_first, status_t,private_linked_list_t *this, void **item) {if (this->count 0)return NOT_FOUND;*item this->first->value;ret…...

Rive 动画框架竟然支持响应式布局,全平台动画框架开启全新 UI 交互能力

没用过 Rive 的可能对于 Rive 还不熟悉&#xff0c;其实之前已经介绍过 Rive 好几次&#xff0c;例如《Rive 2 动画库「完全商业化」》 和《给掘金 Logo 快速添加动画效果》 等文章都介绍过 Rive &#xff0c;之所以会接触 Rive 到&#xff0c; 也是因为多年前想在 Flutter 平台…...

MQ的详细大全知识点

MQ&#xff08;Message Queue&#xff09;是一种在分布式系统中广泛应用的消息中间件&#xff0c;它基于“先进先出”的数据结构原理&#xff0c;用于在不同系统之间传递消息。MQ通过提供接口给各个系统调用&#xff0c;实现了发送者和接收者之间的解耦&#xff0c;使得系统之间…...

AI图像相似性搜索对比:VIT, CLIP, DINO-v2, BLIP-2

图像相似性搜索的核心在于一个简单的想法&#xff1a;图像可以表示为高维空间中的向量。当两个图像相似时&#xff0c;它们的向量应该在这个空间中占据相似的位置。我们可以通过测量角度&#xff08;或余弦相似度&#xff09;来确定这些向量的相似程度。如果角度小&#xff0c;…...

【tomcat系列漏洞利用】

Tomcat 服务器是一个开源的轻量级Web应用服务器&#xff0c;在中小型系统和并发量小的场合下被普遍使用。主要组件&#xff1a;服务器Server&#xff0c;服务Service&#xff0c;连接器Connector、容器Container。连接器Connector和容器Container是Tomcat的核心。一个Container…...

前端学习-盒子模型(十八)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 盒子模型组成 边框 语法 边框简写 代码示例 表格的细线边框 语法 内边距 内边距复合写法 外边距 外边距典型应用 外边距合并 清除内外边距 总结 前…...

【C++】类和对象(十二):实现日期类

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的实现日期类&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1 /!/>/</>/<运算符重载2 /-//-运算符重载(A) 先写&#xff0c;再通过写(B…...

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《提升系统频率支撑能力的“车-氢”柔性可控负荷协同构网控制》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…...

异或的性质

交换两个变量的值&#xff0c;不使用第三个变量。 即a3,b5,交换之后a5,b3; 有两种解法, 一种用算术算法, 一种用^(异或) a a b; b a - b; a a - b; or a a^b;// 只能对int,char… b a^b; a a^b; or a ^ b ^ a; 异或交换两个变量值的方法是利用了异或运算的特性。下面是…...

新一代Webshell管理器

工具介绍 游魂是一个开源的Webshell管理器&#xff0c;提供更为方便的界面和更为简单易用的功能&#xff0c;可配合或代替其他webshell管理器&#xff0c;帮助用户在各类渗透场景中控制目标机器。游魂不仅支持常见的一句话webshell以及常见Webshell管理器的功能&#xff0c;还…...

「iOS」——知乎日报一二周总结

知乎日报仿写 前言效果Manager封装网络请求线程冲突问题下拉刷新添加网络请求的图片通过时间戳和日期格式化获取时间 总结 前言 前两周内容的仿写&#xff0c;主要完成了首页的仿写&#xff0c;进度稍慢。 效果 Manager封装网络请求 知乎日报的仿写需要频繁的申请网络请求&am…...

windows C#-匿名类型

匿名类型提供了一种方便的方法&#xff0c;可用来将一组只读属性封装到单个对象中&#xff0c;而无需首先显式定义一个类型。 类型名由编译器生成&#xff0c;并且不能在源代码级使用。 每个属性的类型由编译器推断。 可结合使用 new 运算符和对象初始值设定项创建匿名类型。 …...

CryptoHack 简介

CryptoHack 简介 文章目录 CryptoHack 简介一、python的安装&#xff0c;运行二、ASCII码三、十六进制四、Base64五、字节和大整数六、XOR1.基本2.xor属性3.xor隐藏字节4.cryptohack——You either know, XOR you dont 一、python的安装&#xff0c;运行 二、ASCII码 chr()函数…...

transformControls THREE.Object3D.add: object not an instance of THREE.Object3D.

把scene.add(transformControls);改为scene.add(transformControls.getHelper());...

游戏开发与游戏运营:哪个更难?

在探讨游戏产业时&#xff0c;游戏开发和游戏运营是两个至关重要的环节。它们各自承担着不同的职责&#xff0c;共同推动着游戏产品的成功与发展。然而&#xff0c;关于哪个环节更难的问题&#xff0c;并没有一个绝对的答案&#xff0c;因为两者都涉及复杂的流程、专业技能和独…...

嵌入式系统调试常见问题与解决方案

嵌入式系统调试中的典型问题分析与解决策略1. 常见调试问题案例分析1.1 程序文件版本错误在嵌入式开发过程中&#xff0c;一个常见的低级错误是使用了错误的程序文件版本。某工程师在调试时发现单片机完全不执行程序&#xff0c;即使是最基本的GPIO控制也无法实现。经过以下排查…...

OpenClaw浏览器自动化:ollama-QwQ-32B驱动的研究资料收集系统

OpenClaw浏览器自动化&#xff1a;ollama-QwQ-32B驱动的研究资料收集系统 1. 为什么需要自动化研究资料收集 作为一名经常需要查阅大量文献的技术写作者&#xff0c;我长期被资料收集的效率问题困扰。传统工作流程中&#xff0c;我需要手动在Google Scholar、arXiv、知乎等平…...

收藏!程序员/小白入门大模型必看,我的AI学习踩坑与正确路线分享

很多程序员和小白同学都私信我说&#xff0c;想入门AI、学习大模型&#xff0c;但始终找不到清晰的切入点&#xff0c;不知道该从哪里开始&#xff0c;也没有适合自己的学习路线。我深耕技术领域多年&#xff0c;从前端自学起步&#xff0c;后来转型学习AI与大模型&#xff0c;…...

如何选择可靠的第三方软件测试机构,构建全生命周期的软件安全防线

在数字化转型的浪潮中&#xff0c;软件已成为企业运营的核心。然而&#xff0c;伴随其重要性一同增长的&#xff0c;是日益严峻的安全威胁。传统软件开发流程中&#xff0c;安全测试往往被置于交付前的独立环节&#xff0c;这种“事后补丁”的模式导致安全漏洞发现晚、修复成本…...

DXVK性能优化:让老旧系统重获新生的完美方案

DXVK性能优化&#xff1a;让老旧系统重获新生的完美方案 【免费下载链接】dxvk Vulkan-based implementation of D3D9, D3D10 and D3D11 for Linux / Wine 项目地址: https://gitcode.com/gh_mirrors/dx/dxvk 为什么老旧电脑运行新程序总是卡顿&#xff1f;DXVK如何解决…...

从‘它怎么又挂了’到‘服务稳如狗’:我是如何用Prometheus+Grafana给自家小项目做监控的

从零搭建轻量级服务监控&#xff1a;PrometheusGrafana实战指南 凌晨三点&#xff0c;手机突然响起刺耳的警报声——这已经是本周第三次被线上服务宕机惊醒。作为独立开发者或小团队&#xff0c;我们往往身兼数职&#xff0c;既要写代码又要维护基础设施。服务崩溃时才发现问题…...

告别杂乱农场:星露谷物语规划神器助你打造高效田园

告别杂乱农场&#xff1a;星露谷物语规划神器助你打造高效田园 【免费下载链接】stardewplanner Stardew Valley farm planner 项目地址: https://gitcode.com/gh_mirrors/st/stardewplanner 你是否曾在星露谷物语中面对一片荒地感到无从下手&#xff1f;种植区域混乱、…...

OpenClaw性能调优:Qwen3-32B在RTX4090D上的参数配置

OpenClaw性能调优&#xff1a;Qwen3-32B在RTX4090D上的参数配置 1. 为什么需要性能调优 当我第一次在RTX4090D上部署Qwen3-32B模型时&#xff0c;本以为高端硬件能轻松应对所有任务。但实际使用OpenClaw执行自动化流程时&#xff0c;却发现响应时快时慢&#xff0c;有时甚至出…...

零基础入门:用eNSP搭建USG5500防火墙IPsec虚拟专用网实验环境

从零构建企业级安全隧道&#xff1a;eNSP模拟USG5500防火墙IPsec实战指南 当你第一次听说"IPsec"这个词时&#xff0c;可能会联想到那些科技电影中黑客们建立的加密通道。实际上&#xff0c;IPsec技术离我们并不遥远——它正默默保护着每天数以亿计的企业数据传输。本…...

Spring Boot实战:5分钟搞定CORS跨域配置(含@CrossOrigin详解)

Spring Boot实战&#xff1a;5分钟搞定CORS跨域配置&#xff08;含CrossOrigin详解&#xff09; 现代Web开发中&#xff0c;前后端分离架构已成为主流选择。这种架构下&#xff0c;前端应用运行在一个域名下&#xff0c;而后端API服务则部署在另一个域名。当浏览器尝试从前端向…...