04_前后端交互技术之Ajax异步请求

本课目标

  • 理解什么是同步请求和异步请求
  • 理解Ajax的请求原理
  • 掌握Ajax的基本用法
  • 掌握课堂案例

1. 同步请求与异步请求的区别

1.1 什么是同步请求
  • 同步请求:发送请求后需要等待服务端响应,同步请求阻止代码的执行,这会导致屏幕上出现“冻结”和无响应的用户体验。

1.2 什么是异步请求
  • 异步请求:当请求的响应数据完全收到之时,会执行一个指定的回调函数,而在执行异步请求的同时,浏览器会正常地执行其他事务的处理。

2. Ajax的基本介绍与XMLHttpRequest对象

  • 官方介绍:从服务器获取数据 - 学习 Web 开发 | MDN

  • AJAX 是异步的 JavaScript 和 XML(Asynchronous JavaScript And XML)。简单点说,就是使用 XMLHttpRequest 对象与服务器通信。它可以使用 JSON,XML,HTML 和 text 文本等格式发送和接收数据。AJAX 最吸引人的就是它的“异步”特性,也就是说它可以在不重新刷新页面的情况下与服务器通信,交换数据,或更新页面。

  • AJAX 最主要的两个特性做下列事:

    • 在不重新加载页面的情况下发送请求给服务器。

    • 接受并使用从服务器发来的数据。

  • XMLHttpRequest:XMLHttpRequest是Ajax的核心,XMLHttpRequest(XHR)对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定URL,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。XMLHttpRequest 在 AJAX 编程中被大量使用。

2.1 Ajax提交Get请求
  • 课堂案例:01.Ajax提交get请求.html

  • <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
    </head>
    <body><script>/* 基于Ajax发送一个get请求1.查看xmlHttpRequest的构造函数,如何创建xmlHttpReqyest2.XMLHttpRequest.open()方法初始化一个新创建的请求,或重新初始化一个请求。xhrReq.open(method, url, async, user, password);3.XMLHttpRequest.send() 方法用于发送 HTTP 请求在 XHR 请求中要发送的数据体。可以是:比如说是POST请求,就需要把POST请求的参数传入,如果是GET请求,就不需要传入参数4.处理服务端的响应内容*///1.创建XMLHttpRequest对象const request = new XMLHttpRequest();//2.方法初始化一个新创建的请求,GET请求的参数是在?后面request.open("GET","http://www.你的有效的网站.cn/spboot/userLoginGetRequest?username=admin&password=66666")//3.发送请求request.send();//4.如何接受服务端的响应内容/* 通过onreadystatechange来监听服务端响应的结果只读属性  XMLHttpRequest.status  返回了响应中的数字状态码XMLHttpRequest.responseText 在一个请求被发送后,从服务器端返回文本。onreadystatechange      当 readyState 的值改变的时候,callback 函数会被调用*/request.onreadystatechange = function(){console.log(request.readyState)//响应完成并且响应成功的话,就获取服务端响应的内容if(request.readyState==4&&request.status==200){//  console.log(request.status)console.log(request.responseText)}}</script>
    </body>
    </html>

2.2 Ajax提交Post请求
  • 课堂案例:02.Ajax提交post请求.html

  • <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
    </head>
    <body><script>/* 请求接口  http://www.有效的网站为什么浏览器会报错?是因为该接口只能够接受POST请求,通过浏览器访问是属于GET请求There was an unexpected error (type=Method Not Allowed, status=405).错误信息:需要在请求的时候,加上头部信息*/const request = new XMLHttpRequest();//2.创建一个与服务器的链接request.open("POST","http://www.有效的网站")//如果是post请求,要加上头部信息request.setRequestHeader("Content-Type","application/x-www-form-urlencoded")//XMLHttpRequest.timeout 是一个无符号长整型数,代表着一个请求在被自动终止前所消耗的毫秒数request.timeout = 1000;        //如果时间内没法发出请求,就失败//3.调用send方法,发送请求request.send("username=admin&password=66666")//4.通过 onreadystatechange 绑定一个回调函数request.onreadystatechange = function(){if(request.readyState==4&&request.status==200){console.log("post异步请求完成")console.log(request.responseText)}}</script>
    </body>
    </html>

2.3 中文编码的方式
  • 课堂案例:03.中文字符编码方式.html

  • <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
    </head>
    <body><script>/* 场景:当请求参数提交到服务端的时候,如果有特殊字符存在,需要进行编码,服务端会自己解码一个中文会被编码成3个字组成encodeURIComponent 和 encodeURI的区别?encodeURIComponent支持的字符更多*/const str = "比屋  教-育"//%E6%AF%94%E5%B1%8B%20%20%E6%95%99-%E8%82%B2const result = encodeURI(str)console.log(str)console.log(result)//服务端解码:  %E6%AF%94const decodeStr = decodeURI("%E6%AF%94")console.log(decodeStr)console.log("------------")/* 对URL进行编码http://www.biwuit.cn/spboot/userLoginGetRequest?username=admin&password=66666*/const url = "http://www.biwuit.cn/spboot/userLoginGetRequest?username=张三&password=66666";console.log(encodeURI(url))console.log(encodeURIComponent(url))</script>
    </body>
    </html>

2.4 JSON对象与字符串互相转换
  • JSON.parse() 方法用来解析 JSON 字符串,构造由字符串描述的 JavaScript 值或对象。提供可选的 reviver 函数用以在返回之前对所得到的对象执行变换 (操作)。

  • JSON.stringify() 方法将一个 JavaScript 对象或值转换为 JSON 字符串,如果指定了一个 replacer 函数,则可以选择性地替换值,或者指定的 replacer 是数组,则可选择性地仅包含数组指定的属性。

  • 课堂案例:04.JSON对象与字符串互相转换.html

    • <!DOCTYPE html>
      <html lang="en">
      <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
      </head>
      <body><script>/* JSON:是一种数据格式,非常容易理解,用途 客户端与服务端之间进行数据传递,客户端可以发送json格式的数据到服务端,服务端也可以响应给客户端json格式的数据首先是一个大括号,在大括号里面就是键值对组成的{key:valuekey:valuekey:valuekey:value}{"username":"zhangsan""age":"22""gender":"男""hobby":"篮球,足球"}总结:jason的数据格式是javascript内置的,可以和jsvascript的对象互相转换,注意的是json格式的数据的key是需要加双引号的*///1.创建一个json格式的字符串const jsonStr = '{"username":"张三","age":"22"}'//2.创建以恶搞js对象const obj = {username:"张三",age:20,gender:"男",hobby:"足球,篮球"}//3.可以把js对象转换成json格式的字符串吗?console.log(obj)console.log(obj.username)const ObjStr = JSON.stringify(obj)console.log(ObjStr)console.log(ObjStr.username)       //只有对象才能通过 . 取值console.log("-------------")//4.可以把json格式的字符串转换成js对象吗?console.log(jsonStr)const jsonObj = JSON.parse(jsonStr)console.log(jsonObj.username)console.log(jsonObj)</script>
      </body>
      </html>

      总结:json的数据格式是javascript内置的,可以和javascirpt的对象互相转换。需要注意的是json格式的数据的key是需要加双引号的。

    • 用途:主要是用于客户端与服务端之间的数据传递。

3. FormData对象的使用

  • FormData:FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式,并且可以轻松的将数据通过XMLHttpRequest.send() 方法发送出去,本接口和此方法都相当简单直接。如果送出时的编码类型被设为 "multipart/form-data",它会使用和表单一样的格式。

  • 课堂案例:05.FormData对象的基本使用.html

    • <!DOCTYPE html>
      <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
      </head><body><form action="http://www.有效的网站" id="form1">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" value="提交"></form><script>/* 问题:如果表单的输入项很多的话,需要手动的获取表单输入项的值,比较繁琐有没有简单的方式?可以使用FormDate()*/const request = new XMLHttpRequest();const form1Obj = document.querySelector("#form1")const inputs = document.querySelectorAll("input")form1Obj.addEventListener("submit", function (e) {//参数表单对象作为参数,自动完成参数的收集const formDataObj = new FormData(form1Obj)//阻止表单的提交e.preventDefault();//通过Ajax提交request.open("POST", "http://www.有效的网站")//头部信息      如果数据格式是FormData,不需要头部信息// request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");//获取数据// const usernameValue = inputs[0].value;// const passwordValue = inputs[1].value;// const args = "username="+usernameValue+"&"+"password="+passwordValue;//使用FormDate获取参数console.log(formDataObj.get("username"))console.log(formDataObj.get("password"))request.send(formDataObj)// request.send(args)request.onreadystatechange = function () {if (request.readyState == 4 && request.status == 200) {console.log(request.responseText)}}})</script>
      </body></html>

      FormData 的 get() 方法用于返回 FormData 对象中和指定的键关联的第一个值,如果你想要返回和指定键关联的全部值,那么可以使用 getAll() 方法。

4. json格式数据作为参数提交

  • 课堂案例:06.json数据格式提交.html

  • <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
    </head>
    <body><form action="http://www.有效的网站" id="form1">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" value="提交"></form><script>/* 需求:服务端接受的参数格式需要json的数据格式我们掌握的参数格式:username=admin&password=123提交参数个格式必须为:{"username":"admin","password":"123"}需要把上面的数据格式转换为json格式如何实现?*/const request = new XMLHttpRequest();const form1Obj = document.querySelector("#form1")form1Obj.addEventListener("submit", function (e) {//阻止表单的提交e.preventDefault();//参数表单对象作为参数,自动完成参数的收集const formDataObj = new FormData(form1Obj)//需要json的数据格式const submitObj = {};formDataObj.forEach(function(value,key){//第一次遍历 username:admin//第二次遍历 passname:123// console.log(value)  // console.log(key)submitObj[key] = value;})//把submitArgs对象转换为json格式字符串const submitArgs = JSON.stringify(submitObj)console.log(submitArgs)request.open("POST", "http://www.有效的网站")request.send(submitArgs)request.onreadystatechange = function () {if (request.readyState == 4 && request.status == 200) {console.log(request.responseText)}}})</script>
    </body>
    </html>

5. 文件上传的实现

  • 课堂案例:07.文件上传案例实现.html

  • <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
    </head>
    <body><!-- 需求:将图片上传到服务器--><input type="file" id="file1"><br><button>上传图片</button><br><!-- 显示上传的图片src:填写服务器的地址--><img src="" alt="" height="700px" width="600px"><script>/* 通过Ajax上传图片*/const request = new XMLHttpRequest();const fileObj = document.querySelector("#file1")const btnObj = document.querySelector("button")const imgObj = document.querySelector("img")//绑定事件btnObj.addEventListener("click",function(){//2.判断用户是否添加了文件console.dir(fileObj)if(fileObj.files.length<=0){return alert("请上传图片")}//3.将用户添加的文件绑定到formData对象console.log("-----------")const formData = new FormData();console.dir(formData)formData.append('files',fileObj.files[0])//4.发送Ajax请求,需要通过post请求发送request.open("POST","http://www.有效的网站")request.send(formData)request.onreadystatechange = function () {if (request.readyState == 4 && request.status == 200) {//获取服务端响应胡来的内容//{"msg":"文件上传成功","fileName":"f78fc8ba-2553-4b1f-8b02-5fae2f39b3101.jpg","code":200}//服务端在存储文件的时候,因为考虑到文件名会相同覆盖,所以在服务端生成一个随机字符串来代替文件名console.log(request.responseText)//5.把上传到服务端图片显示在当前页面//6.需要判断服务端响应回来的消息是否是文件上传成功,如果是 才显示const responseValue = JSON.parse(request.responseText) if(responseValue.msg=="文件上传成功"){//会显到页面imgObj.src = 'http://www.有效的网站/'+responseValue.fileName;}}}})</script>
    </body>
    </html>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux exit命令教程:结束当前的登录会话(附案例详解和注意事项)

Linux exit命令介绍 exit命令用于结束当前的登录会话。当你在命令行界面&#xff08;shell&#xff09;运行exit命令时&#xff0c;它会终止你当前的shell会话。 在命令行界面或shell脚本中执行exit命令默认会直接退出终端&#xff0c;或者你还可以在exit命令后添加一个参数&…

Linux中断 -- 中断路由、优先级、数据和标识

目录 1.中断路由 2.中断优先级 3.中断平衡 4.Linux内核中重要的数据结构 5.中断标识 承前文&#xff0c;本文从中断路由、优先级、数据结构和标识意义等方面对Linux内核中断进行一步的解析。 1.中断路由 Aset affinity flow GIC文中有提到SPI类型中断的路由控制器寄存器为…

华为HCIP Datacom H12-831 卷14

多选题 1、以下哪些Community属性可以保证BGP路由条目的传播范围只在AS内? A No_Export B No_Export_Subconfed C Interne D No_Advertise 正确答案 A,B 解析&#xff1a;Internet&#xff1a;缺省情况下&#xff0c;所有的路由都属于internet团体。具有此属性的路由…

回归预测 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SSA-SVR麻雀算法优化支持向量机的数据…

ubuntu-base(arm64与riscv64) 根文件系统, 并用qemu启动

ubuntu-base&#xff08;arm64与riscv64&#xff09; 根文件系统 有个小需求&#xff0c;是在 arm64 和 riscv64 上都跑起来 speccpu 2017 首先在 Qemu 上跑起来&#xff0c;需要考虑需要的【Linux 内核、根文件系统、Bootloader】&#xff0c;其中 Bootloader 在 Qemu 中可以很…

Kong: Services and Routes 等基本属性

Services 在Kong Gateway中&#xff0c;服务是现有上游应用程序的抽象。服务可以存储插件配置和策略等对象的集合&#xff0c;并且可以与路由相关联。 定义服务时&#xff0c;管理员会提供名称和上游应用程序连接信息。连接详细信息可以在 url 字段中以单个字符串的形式提供…

RCC——使用HSE/HSI配置时钟

RCC 文章目录 前言一、背景二、仿真计算周期 2.1 2.2 三、MCO引脚输出时钟总结 前言 前期疑问&#xff1a;1、RCC是什么意思。 2、最终配好的72M是系统时钟吗&#xff1f; 3、一共有哪些时钟 本文目标&#xff1a;将PLL时钟配置成72M 疑问解答&#xff1a;最终配好的时钟是…

用Flask打造一个大模型智能问答WEB网站

目前已经有很多类似GPT的大模型开源,可以提供类似ChatGPT的智能问答功能。我也基于这些开源模型,用Flask来建立一个智能问答网站,可以方便用户建立自己的ChatGPT系统。 这个网站需要提供用户登录功能,对已登录的用户,可以在网站上提出问题,并由大模型处理后返回答案。演…

C++ 实现多线程的生产者(producer) - 消费者(consumer) 模型

1. 模型介绍&#xff1a; 生产者消费者模型是操作系统中的一种并发编程模型&#xff0c;用于解决生产者和消费者之间的数据共享和同步问题。 在该模型中&#xff0c;生产者负责生成数据&#xff0c;并将数据放入一个有限的缓冲区中&#xff0c;而消费者则从缓冲区中取出数据进…

网上零食销售系统

技术架构&#xff1a; Servlet MySQL JSP 功能描述&#xff1a; 1.浏览商品 &#xff08;1&#xff09; 商品详细资料 &#xff08;2&#xff09; 商品编号 2.订购商品 3.购物车 4.用户信息维护 &#xff08;1&#xff09; 用户注册 &#xff08;2&#xff09; 用户…

04-Seata修改通信端口

基于docker环境部署下&#xff0c;可以翻看专栏之前的文章 配置文件 /home/server/seata/resources/application.yml 默认${server.port} 1000 1、修改服务端(TC)配置 seata:server:service-port: 7090 2、修改映射端口 在启动脚本中修改映射端口 docker run -id --nam…

嵌入式——实时时钟(RTC)

目录 一、初识RTC 1.简介 2.特性 3.后备寄存器和RTC寄存器特性 二、RTC组成 1.相关寄存器 &#xff08;1&#xff09;控制寄存器高位&#xff08;RTC_CRH&#xff09; &#xff08;2&#xff09;控制寄存器低位&#xff08;RTC_CRL&#xff09; &#xff08;3&#xf…

『建议收藏』OpenAI官方出的Prompt提示词教程中文版来了!

一些结论 六大策略: 写清晰的指令 提供参考文本 将复杂任务分解为更简单的子任务 给模型时间“思考” 使用外部工具 系统性测试变化 提高结果质量的六大策略 写清晰的指令 这些模型无法读懂你的想法。如果输出过长&#xff0c;要求简短回复&#xff1b;如果输出过于简单…

Redis客户端之Redisson(二)Redisson组件

Redisson的几个常用客户端 一、RedissonClient 1、创建 通过Config对象配置RedissonClient所需要的参数&#xff0c;然后获取RedissonClient对象即可。 Config config new Config(); config.useSingleServer().setAddress("redis://127.0.0.1:6379"); RedissonC…

【python】argparse解析参数的过程

python基础知识 python文件解析if __name__ __main__的作用import到底导入了什么&#xff1f;argparse解析命令行参数的过程 python文件解析 Python和C语言的编译、执行过程有很大区别。我们先回顾一下c语言的执行过程&#xff0c;首先代码文件要编译&#xff0c;编译通过&am…

【C++杂货铺】详解类和对象 [上]

博主&#xff1a;代码菌-CSDN博客 专栏&#xff1a;C杂货铺_代码菌的博客-CSDN博客 目录 &#x1f308;前言&#x1f308; &#x1f4c1; 面向对象语言的特性 &#x1f4c1; 类 &#x1f4c2; 概念 &#x1f4c2; 定义 &#x1f4c1; 访问限定符 &#x1f4c2;分类 &#x…

《WebKit 技术内幕》学习之十五(1):Web前端的未来学习

1 趋势 说到Web方面的趋势&#xff0c;特别是HTML5获得的巨大发展&#xff0c;W3C和WHATWG等组织正在不停地推动规范的演进和引入新的规范&#xff0c;这一举动必将极大地推动Web前端的发展。就目前Web前端来说&#xff0c;各种类型的技术非常多&#xff0c;极容易引起大家的误…

CMake 完整入门教程(一)

1 前言 每一次学习新东西都是很有乐趣的&#xff0c;虽然刚开始会花费时间用来学习&#xff0c;但是实践证明&#xff0c;虽然学习新东西可能会花费一些时间&#xff0c;但是它们带来的好处会远远超过这些花费的时间。学习新东西是值得的&#xff0c;也是很有乐趣的。 网络上…

【K8S 云原生】K8S的图形化工具——Rancher

目录 一、rancher概述 1、rancher概念 2、rancher和K8S的区别&#xff1a; 二、实验 1、安装部署 2、给集群添加监控&#xff1a; 3、创建命名空间&#xff1a; 4、创建deployment&#xff1a; 5、创建service&#xff1a; 6、创建ingress&#xff1a; 7、创建hpa 8…

基于高精度YOLOv8开发构建公共场景下行人人员姿态估计分析识别系统

姿态估计&#xff08;PoseEstimation&#xff09;在我们前面的相关项目中涉及到的并不多&#xff0c;CV数据场景下主要还是以目标检测、图像识别和分割居多&#xff0c;最近正好项目中在使用YOLO系列最新的模型开发项目&#xff0c;就想着抽时间基于YOLOv8也开发构建实现人体姿…