让大家都能理解 XMLHttpRequest

让大家都能理解 XMLHttpRequest

  XMLHttpRequest 是一个 JavaScript 对象,它能够在浏览器和 Web 服务器之间发送和接收数据。即使在从 Web 服务器读取了所有数据之后,XMLHttpRequest 仍然可以发送和接收数据,从而实现不重新加载页面就能够重写页面内容的功能。在当今的 Web 服务中,使用 XMLHttpRequest 发送和接收数据是非常必要的。尽管现在使用XMLHttpRequest 直接与Web服务器收发数据的机会不多,大多数情况下都是使用 axios(底层使用 XMLHttpRequest)和 fetch 函数。但是,理解 XMLHttpRequest 对于理解这些技术仍然非常重要,因此我们应该深入了解它。

  • 让大家都能理解 XMLHttpRequest
    • 1 XMLHttpRequest使用
    • 2 XMLHttpRequest 处理流程
    • 3 onreadystatechange 事件
    • 4 接收 JSON 数据
    • 5 响应类型
    • 6 XMLHttpRequest其他事件
    • 7 FormData 请求

1 XMLHttpRequest使用

以下是使用 XMLHttpRequest 的 JavaScript 代码,它应该写在脚本标签中:

<script>

// (1)XMLHttpRequest对象创建
var xmlHttpRequest = new XMLHttpRequest();

// (2)onreadystatechange监听请求的状态
xmlHttpRequest.onreadystatechange = function(){
    if(this.readyState == 4 && this.status == 200){
        console.log(this.responseText);
    }
}

// (3)HTTP通过GET服务路径与服务器进行通信
xmlHttpRequest.open(
  'GET',
  'https://jsonplaceholder.typicode.com/users/1',
  true
);
// (4)HTTP中发生信息
xmlHttpRequest.send();
</script>

我们可以使用 https://jsonplaceholder.typicode.com/ URL 来进行测试,它是一个公共的网络测试资源地址,专门用于测试。如果您不想搭建自己的服务器,可以尝试使用它来进行 Ajax 路径测试。

2 XMLHttpRequest 处理流程

(1) 创建一个XMLHttpRequest对象

var xmlHttpRequest = new XMLHttpRequest();

创建 XMLHttpRequest 实例,使用该实例可以在浏览器和服务器之间进行通信。

(2)用onreadystatechange事件监听请求状态

xmlHttpRequest.onreadystatechange = function(){
    if(this.readyState == 4 && this.status == 200){
        console.log(this.responseText);
    }
}

  可以使用 onreadystatechange 事件来监视 XMLHttpRequest 处理状态的变化。该事件用于监视状态的变化,以便可以检测来自服务器的响应(即接收到的数据)何时完成。此外,还可以通过确认响应的 HTTP 状态代码是否为 200,来确定请求是否成功。

readyState 被分配一个从 0 到 4 的数字,代表处理的状态,其中 4 代表请求处理完成。如果 readyState 为 4,状态码为 200,则可以使用 console.log 命令打印接收到的数据。

由于 XMLHttpRequest 与服务器进行异步通信,与等待同步处理完成不同,您不知道何时处理完成。因此,我们需要使用 onreadystatechange 事件来监视处理状态,并采取适当的措施。

使用该事件,可以在请求的处理过程中多次检查 readyState 的值,并据此采取必要的操作,以确保在处理完成时能够得到所需的结果。

(3)指定HTTP GET方法和访问位置

xmlHttpRequest.open(
  'GET',
  'https://jsonplaceholder.typicode.com/users/1',
  true
);

第三个参数 true 是异步设置。如果异步则设置为 true,如果同步则设置为 false。

XMLHttpRequest.open('HTTP类型','URL',['async',user,password])

如果要进行异步通信,则应将 async 参数设置为 true,如果要进行同步通信,则应将其设置为 false。在使用 open 方法时,还可以指定用户和密码,以进行基本身份验证。

(4) 发送HTTP请求

xmlHttpRequest.send();

发送请求到服务器然后等待服务器的响应。我们可以使用 (2) 中的事件来检查服务器的响应是否完成。

3 onreadystatechange 事件

在ajax请求的时候每当处理状态发生变化时,都会产生 readystatechange 事件,以便代码可以相应地处理变化。当前状态可以通过 readyState 属性进行判断。readyState 属性被分配了 0 到 4 之间的值,并且含义因数字而异。

  • readyState=0 : status=UNSENT: 初始状态(实例创建)
  • readyState=1 : status=OPENED: 打开方法执行
  • readyState=2 : status=HEADERS_RECEIVED: 收到响应头
  • readyState=3 : Status=LOADING: 正在接收数据
  • readyState=4 : status=DONE: 请求完成

使用下面的代码检查每次进程状态更改时是否实际触发了 onreadystatechange 事件。除了 onreadystatechange 事件外,其余的代码与前面解释的代码相同。

xmlHttpRequest.onreadystatechange = function(){   
    if(this.readyState == 0){
        console.log('UNSENT:初始状态')
    }            
    if(this.readyState == 1){
        console.log('OPENED: 打开方法执行')
    }            
    if(this.readyState == 2){
        console.log('HEADERS_RECEIVED:收到响应头')
    }            
    if(this.readyState == 3){
        console.log('LOADING:正在接收数据')
    }
    if(this.readyState == 4){
        console.log('DONE: 请求完成')
    }
}

4 接收 JSON 数据

在与服务器进行通信时,大多数情况下数据都是以 JSON 格式发送的。我们可以将服务器返回的数据转换为 JSON 格式。请注意,服务器端的处理因环境而异,返回的数据格式有所不同。但是我们大多数情况使用 Spring Boot 作为服务端,因此返回的数组会自动转换为 JSON 格式。

xmlHttpRequest.onreadystatechange = function(){
    if(this.readyState == 4 && this.status == 200){
        user = JSON.parse(this.responseText);
        console.log(user)
    }
}

如果this.responseText返回的数据是以字符串形式的 JSON 数据传输的,我们需要使用JSON.parse()方法将其解析成一个 JavaScript 对象。如果不进行转换,该数据可能会被解释为 undefined。

5 响应类型

如果你设置了 Response Type 为 JSON,那么可以直接获取响应数据的格式。因此,不需要再运行 JSON.parse 将其转换为对象。不过,需要注意的是,在获取值时,应该使用 response 属性,而不是 responseText。

var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.responseType = 'json';
xmlHttpRequest.onreadystatechange = function(){

    if(this.readyState == 4 && this.status == 200){
        //responseType = 'json' 不能使用this.responseText 
        //直接使用 response
        user = this.response;
        console.log(user)
    }
}

使用 getAllResponseHeaders() 检查来自服务器的响应标头信息。

var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.responseType = 'json';
xmlHttpRequest.onreadystatechange = function(){

    if(this.readyState == 4 && this.status == 200){
        //responseType = 'json' 不能使用this.responseText 
        //直接使用 response
        user = this.response;
        console.log(user);
        console.log(this.getAllResponseHeaders());
    }
}

6 XMLHttpRequest其他事件

我们使用 onreadystatechange 事件来检查处理状态,除了 onreadystatechange 事件之外,还有以下事件可以使用。

  • onloadstart :请求开始时
  • onprogress :定期运行,直到请求完成。也可以检查接收到的数据。
  • onabort :当请求被 abort 方法中止时
  • onerror : 当请求发生错误时
  • onload :请求完成时
  • ontimeout :请求超时时

设置以下 6 个事件并检查它们是被执行正常工作。

xmlHttpRequest.onloadstart = function(){
    console.log('onloadstart请求开始时');
};

xmlHttpRequest.onprogress = function(){
    console.log('onprogress事件');
};

xmlHttpRequest.onload = function(){
    console.log('onload事件');
};

xmlHttpRequest.onabort = function(){
    console.log('onabort事件');
};

xmlHttpRequest.onerror = function(){
    console.log('onerror事件');
};

xmlHttpRequest.ontimeout = function(){
    console.log('ontimeout事件');
};

我们可以看到浏览器GET请求成功完成后只执行了以下3个事件。

onloadstart请求开始时
onprogress事件
onload事件

abort 事件触发条件,只有在XMLHttpRequest在代码中设置abort方法,并且使用它。发送数据后立即执行 abort 方法,才会执行abort 事件。

xmlHttpRequest.send();

xmlHttpRequest.abort();

这样才可以看到在启动请求的 onloadstart 之后触发了 onabort 事件。

接下样我们看看超时事件 ontimeout 触发条件。设置请求超时。由于单位是毫秒,如果请求后2000(=2秒)服务器没有响应,就会执行事件。

xmlHttpRequest.timeout = 2000

onerror 事件 触发条件是,访问了服务器端一个不存在的IP地址,onerror 事件才会发生。

xmlHttpRequest.open('GET','http://127.0.0.100',true);

我发现可以在 onerror 事件中检查网络级错误。当收到 404 错误,这意味着你能够与服务器通信,但是页面不存在。在这种情况下,我们可以在执行的 onload 事件中进行检查。当程序执行 onload 事件时,也会显示HTTP状态码,返回状态码404和Not Found404。

xmlHttpRequest.onload = function(){
    console.log('onload事件');
    //状态
    console.log(this.status);
};

我们可以使用HTTP状态代码来判断是否发生了HTTP级别的错误。如果状态代码不是正常的200,就可以终止程序的运行;否则,程序可以继续运行。我们通常会使用它来处理 404 以及服务器的 Eroro 500错误。

xmlHttpRequest.onload = function(){
    if(this.status != 200){
    console.log(this.status + ':程序终止运行。');
    }else{
        console.log(this.status + '正常运行。');
    }
};

7 FormData 请求

下面是用于向服务器异步发送数据的 JavaScript 代码。

<script>

    // (1)XMLHttpRequest创建实例
    var xmlHttpRequest = new XMLHttpRequest();

    // (2)HTTP的POST请求
    xmlHttpRequest.open('POST','/api/onsave',true);

    // (3)数据发送的格式类型
    xmlHttpRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

    // (4)HTTP发送的数据
    xmlHttpRequest.send('id=2&name=zht');

</script>

步骤(3)的设置是指定要发送的数据的格式。这次发送数据的格式是key1=value1&key2=value2,所以Content-Type要设置成application/x-www-form-urlencoded。如果不指定数据格式,在服务器端可能无法正常的接收数据。

大多数的时候我们会使用 FormData 对象发送数据。让我们看看FormData 是如何发送数据的。

var xmlHttpRequest = new XMLHttpRequest();

var formData = new FormData();

formData.append("id", 3);
formData.append("name","zht");
xmlHttpRequest.open('POST','/api/onsave',true);

xmlHttpRequest.send(formData);

代码中使用 FormData 的 append 方法添加要发送的数据。此外,使用 FormData发送数据在代码中不需要设置内容类型setRequestHeader 。

通过下面的例子让我们看看在html代码中如何使用FormData将form数据发送到服务端的。

<form name="user">
    Id:<input type="text" name="id"><br>
    名称:<input type="text" name="name"><br>
    <input type="submit" onclick="sendPost();return false;">添加</button>
</form>

创建 sendPost 函数,该函数内部使用 document.forms.user 方法将表单的内容放入 FormData 对象中。通过发送 FormData 对象,将输入表单的内容发送到服务器(使用 POST 请求方式)。

function sendPost(){
    var xmlHttpRequest = new XMLHttpRequest();
    var formData = new FormData(document.forms.user);
    xmlHttpRequest.open('POST','/api/onsave',true);
    xmlHttpRequest.send(formData);
}

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

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

相关文章

图的存储及基本操作总结(邻接矩阵、邻接表)及C/C++代码实现

文章目录 前言一、邻接矩阵1.概念2.图像示例3. 代码实现注意邻接矩阵的特点 二、邻接表1.概念2.图像示例3.代码实现邻接表的特点 前言 图是一种比较复杂的数据结构&#xff0c;每个结点之间可以有多种关系。 所以&#xff0c;一个图可以呈现出千奇百怪的形式。 对于不同的形式…

java调用webservicer的方法

对于使用 Webservicer的方式&#xff0c;一般采用 Java API调用的方式。Webservicer是一个运行在浏览器中的客户端程序&#xff0c;它可以通过 Webservicer的接口来访问服务器上的服务。 使用 Java调用 Webservicer有两种方式&#xff1a; 下面是一个简单的例子&#xff1a; 2、…

【Vue】学习笔记-初始化脚手架

初始化脚手架 初始化脚手架说明具体步骤脚手架文件结构 初始化脚手架 说明 Vue脚手架是vue官方提供的标准化开发工具&#xff08;开发平台&#xff09;最新版本是4.x文档Vue CLI 具体步骤 如果下载缓慢请配置npm淘宝镜像 npm config set registry http://registry.npm.taoba…

浅谈个人对“孔乙己的长衫“的感受

名人说&#xff1a;往者不可谏&#xff0c;来者犹可追。——《论语微子篇》 创作者&#xff1a;Code_流苏(CSDN) ★温馨提示&#xff1a;以下仅代表个人观点&#xff0c;不代表其它任何人看法。 目录 〇、缘由一、社会对于学历和职业之间的关系认知是怎样的&#xff1f;二、学…

【算法】从x的n次方看递归时间复杂度计算

从x的n次方看递归时间复杂度计算 1.循环 这个问题&#xff0c;最简单的办法是用循环 int pow1(int x,int n) {int result 1;for(int i0;i<n;i){result*x;}return result; }如上算法的时间复杂度为O(N)&#xff0c;但还是不够理想。这时尝试使用递归算法 2.递归1 int po…

51单片机入门

文章目录 一、安装keil5及proteus二、MCS-51单片机结构与原理(一).8051单片机基本组成(二).8051单片机引脚1.电源引脚2.时钟电路引脚3.控制信号引脚4.输入/输出端口 (三) 并行输入/输出端口结构 三、单片机cx51编程基础(一).变量定义(二).数据类型(三).存储类型(四).Cx51语言程…

快手社招Java后端开发岗面试,被问麻了

社招面试是基于你的工作项目来展开问的&#xff0c;比如你项目用了 xxx 技术&#xff0c;那么面试就会追问你项目是怎么用 xxx 技术的&#xff0c;遇到什么难点和挑战&#xff0c;然后再考察一下这个 xxx 技术的原理。 今天就分享一位快手社招面经&#xff0c;岗位是后端开发&…

使用vue.component全局注册组件、props的使用

通过components注册的是私有子组件 例如&#xff1a; 在组件A的 components 节点下&#xff0c;注册了组件F。 则组件F只能用在组件A中;不能被用在组件C中。 注册全局组件 在vue项目的 main.js 入口文件中&#xff0c;通过 Vue.component() 方法&#xff0c;可以注册全局组件…

springboot+vue小区物业管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的小区物业管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

【2023软考】信息系统监理师与系统集成项目管理工程师哪个更好考?

肯定是系统集成项目管理工程师更好考。 软考信息系统监理师是一项国家级专业职业资格证书&#xff0c;是我国信息技术行业的重要职业资格之一。软考信息系统监理师主要从事信息系统建设项目的监理和管理工作&#xff0c;包括项目前期准备、项目实施阶段和项目验收阶段的监理和…

字符串总结

一、最长公共前缀 1.方法一&#xff1a;横向扫描 class Solution { public:string longestCommonPrefix(vector<string>& strs) {if (!strs.size()) {return "";}string prefix strs[0];int count strs.size();for (int i 1; i < count; i) {prefix…

VS同时调试主程序和子程序工具

VS要想要实现同时调试主程序和子程序&#xff0c;可使用工具 Microsoft Child Process Debugging power Tool 来实现。 我的环境和官方使用说明 环境&#xff1a;VS2019 官方使用说明&#xff1a;Introducing the Child Process Debugging Power Tool - Azure DevOps Blogh…

Shell编程规范与使用

目录 一、Shell脚本概述 1&#xff09;Shell的作用——命令解释器&#xff0c;“翻译官” 2&#xff09;常见shell解释器 3&#xff09;编程语言类型 4&#xff09;Shell脚本 编写脚本代码 Shell脚本的构成 赋予可执行权限 Shell脚本的执行方法 5&#xff09;重定向与…

【学习笔记】unity脚本学习(六)【GUI发展历程、IMGUI控件、Layout自动布局】

目录 unity 界面发展IMGUINGUI其他GUI插件uGUIUI 工具包比较 GUI基础GUI静态变量Unity扩展编辑器屏幕空间的总尺寸Screen.width 和 Screen.height GUI静态函数&#xff08;GUI控件&#xff09;Label图片 Box控件Button与RepeatButtonTextFieldTextAreaPasswordField其他控件 GU…

缓存优化---环境搭建

缓存优化 为什么要使用redis缓存&#xff1f; 问题说明 用户数量多&#xff0c;系统访问大&#xff0c;频繁访问数据库&#xff0c;系统性能下降&#xff0c;用户体验差 环境搭建 maven坐标 在项目中的pom.xml文件中导入spring data redis的maven坐标&#xff1a; <depen…

Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换

场景 JavaGeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示&#xff1a; JavaGeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示_霸道流氓气质的博客-CSDN博客 在上面实现Java中集成Geotools之后&#xff0c;需求是将WKT数据转换成其他坐标系的W…

web前端实验5

实 验 报 告 课 程 Web前端应用开发 实验项目 Jquery AJAX编程 成 绩 专业班级 班内序号 指导教师 姓 名 学 号 实验日期 实验目的及要求&#xff1a; &#xff08;1&#xff09; 理解和掌握Jquery AJAX的get方式请求 &#xff08;2&#xff09; 理解和掌握Jquery AJAX的pos…

Redis可视化工具-Another Redis Desktop Manager 安装与连接哨兵集群

目录 一、下载安装 1.1 下载 1.2 安装 二、使用 2.1 新建连接 2.2 新增数据 2.3 应用设置 2.3.1深色模式、语言 2.3.2多个连接的颜色标记 一、下载安装 Another Redis DeskTop Manager 是 Redis 可视化管理工具&#xff0c;体积小&#xff0c;完全免费。最重要的是稳定…

低代码平台名声臭,用起来却真香——60%开发者不敢承认

群体盲从意识会淹没个体的理性&#xff0c;个体一旦将自己归入该群体&#xff0c;其原本独立的理性就会被群体的无知疯狂所淹没。——《乌合之众》 不知道从什么时候开始&#xff0c;“低代码不行”的论调充斥着整个互联网圈子&#xff0c;csdn、掘金、知乎、B站、脉脉……到处…

面试华为,花了2个月才上岸,真的难呀····

花2个月时间面试一家公司&#xff0c;你们觉得值吗&#xff1f; 背景介绍 美本计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比…