AJAX:整理3:原生AJAX的相关操作

注意AJAX的步骤 

// 1.创建对象
const xhr = new XMLHttpRequest()// 2.初始化 设置 请求方法 和 url
xhr.open("GET", "http://localhost:9090/server")// 3.发送
xhr.send()// 4.事件绑定 处理服务端返回的结果
// readyState 是xhr对象中的属性,表示状态 0 1 2 3 4  
// 0 表示初始值; 1 表示open()方法调用完毕;2 表示send()方法调用完毕;3 表示服务端返回了部分结果;4 表示服务端返回了所有的结果// change 改变
xhr.onreadystatechange = function () { // 判断状态码if (xhr.readyState === 4) {// 判断状态码if (xhr.status >= 200 && xhr.status < 300) {// 获取服务端返回的结果 (行 头 空行 响应体)console.log(xhr.status) // 响应行里面的响应状态码  200console.log(xhr.statusText) // 状态字符串  OKconsole.log(xhr.getAllResponseHeaders()) // 所有响应头console.log(xhr.response)  // 响应体const result = xhr.response }}}

1. GET 请求

需求:向服务端发送get请求,拿到服务端返回的结果,并显示在div盒子中

(1)server.js

// 1. 引入express
const express = require('express')// 2. 创建服务器
const app = express()// 3.创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装
app.get('/server', (request, response)  => {// 设置响应头  设置允许跨域  !!!response.setHeader('Access-Control-Allow-Origin', '*')// 设置响应体response.send('HELLO AJAX GET')
})// 4. 监听端口
app.listen(9090, () => {console.log("服务已启动, 9090端口监听中...")
}) 

(2)前端页面并渲染服务端返回的结果

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ajax GET 请求</title><style>#result {width: 200px;height: 100px;border: 1px solid pink;}</style>
</head>
<body><button id="btn">点击发送请求</button><div id="result"></div><script>// 获取button元素const btn = document.querySelector("#btn")// 绑定事件btn.addEventListener("click", function () {// console.log("test")// 1.创建对象const xhr = new XMLHttpRequest()// 2.初始化 设置请求方法和urlxhr.open("GET", "http://localhost:9090/server?a=100&b=30") // 携带参数// 3.发送xhr.send()// 4.事件绑定 处理服务端返回的结果// readyState 是xhr对象中的属性,表示状态 0 1 2 3 4// change 改变xhr.onreadystatechange = function () { // 判断状态码if (xhr.readyState === 4) {// 判断状态码if (xhr.status >= 200 && xhr.status < 300) {// 获取服务端返回的结果 (行 头 空行 响应体)console.log(xhr.status) // 响应行里面的响应状态码 200console.log(xhr.statusText) // 状态字符串  OKconsole.log(xhr.getAllResponseHeaders()) // 所有响应头console.log(xhr.response)const result = xhr.response // 响应体// 把结果放到div中document.querySelector("#result").innerHTML = result}}}})</script>
</body>
</html>

 

2. GET请求携带参数

3. POST请求 

当鼠标放在div盒子上时,向服务端发送post请求,将响应的结果在div中呈现

 (1)server.js

// 1. 引入express
const express = require('express')// 2. 创建服务器
const app = express()// 3.创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装
app.post('/server', (request, response)  => {// 设置响应头  设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 设置响应体response.send('HELLO AJAX POST')
})// 4. 监听端口
app.listen(9090, () => {console.log("服务已启动, 9090端口监听中...")
}) 

(2)前端页面并渲染数据到盒子中

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ajax POST 请求</title><style>#result {width: 200px;height: 100px;border: 1px solid pink;}</style>
</head>
<body><div id="result"></div><script>// 获取元素对象const result = document.querySelector('#result')// 绑定事件result.addEventListener('mouseover', function (){// console.log('鼠标移动')// 1. 创建对象const xhr = new XMLHttpRequest()// 2. 初始化 设置类型与URLxhr.open('POST', 'http://localhost:9090/server')// 3. 发送xhr.send()// 4. 事件绑定xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {// 获取服务器响应的数据const data = xhr.responseText// 把数据渲染到页面result.innerHTML = data}}}})</script>
</body>
</html>

4. POST请求中设置参数

 

 5.  AJAX设置请求头信息

 

但是如果自定义一个请求头呢,浏览器会有安全机制,不让发送

如果我们非要发的话,可以用以下的方法 

6. 服务端响应JSON数据

需求:当点击键盘时,会向服务端发送请求,服务端响应结果会在div盒子中呈现

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>#result {width: 200px;height: 100px;border: 1px solid pink;}</style></head>
<body><div id="result"></div><script>// 获取元素对象const result = document.querySelector('#result')window.onkeydown = function(e){// console.log(e.key, e.keyCode)// 1. 发送请求const xhr = new XMLHttpRequest()// 设置响应体类型// xhr.responseType = 'json'  // 可以自动转换// 2. 初始化 设置请求方法和urlxhr.open('GET', 'http://localhost:9090/server_json')// 3. 发送xhr.send()// 4.事件绑定xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {// 获取服务器响应的数据const data = xhr.responseresult.innerHTML = dataconsole.log(data)}}}}</script>
</body>
</html>

 

 1. 手动转换

2.自动转换

7. AJAX解决IE缓存问题

IE浏览器会对请求结果作一个缓存,这样就会导致一个问题,就是下一次再发送请求时,走的就是本地的缓存,而并不是服务器返回的最新数据

/* 针对IE缓存问题 */
app.all('/ie', (request, response)  => {// 设置响应头  设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 响应头response.setHeader('Access-Control-Allow-Headers', '*')  // 所有类型的头信息都可以接受// 设置响应体response.send("hello IE")
})
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>#result {width: 200px;height: 100px;border: 1px solid pink;}</style>
</head>
<body><button>点击发送请求</button><div id="result"></div><script>// 获取元素const btn = document.getElementsByTagName('button')[0]const result = document.getElementById('result')btn.addEventListener("click", function() {const xhr = new XMLHttpRequest()xhr.open('GET', 'http://localhost:9090/ie?t='+Date.now())  // 加个参数解决IE缓存问题xhr.send();xhr.onreadystatechange = function() {if(xhr.readyState === 4) {if(xhr.status >= 200 && xhr.status < 300) {// 处理服务端返回的结果result.innerHTML = xhr.response;}}}})</script>
</body>
</html>

 

8. AJAX请求超时以及网络异常处理

1.请求超时

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>#result {width: 200px;height: 100px;border: 1px solid pink;}</style>
</head>
<body><button>点击发送请求</button><div id="result"></div><script>// 获取元素const btn = document.getElementsByTagName('button')[0]const result = document.getElementById('result')btn.addEventListener("click", function() {const xhr = new XMLHttpRequest()// 超时设置xhr.timeout = 2000// 超时回调xhr.ontimeout = function() {alert('网络异常,请稍后重试!')}xhr.open('GET', 'http://localhost:9090/delay')xhr.send()xhr.onreadystatechange = function() {if(xhr.readyState === 4) {if(xhr.status >= 200 && xhr.status < 300) {// 处理服务端返回的结果result.innerHTML = xhr.response;}}}})</script>
</body>
</html>

 

 

 

 2. 网络异常

 

9. AJAX取消请求

 

 

10. AJAX解决请求重复发送问题

当请求响应比较慢的时候,用户就会疯狂地点击,这时候服务器就会接收到大量的相同请求,服务器压力比较大

所以我们需要保证始终只有一个请求在发送,这样服务器的压力就会小一些 

 

 

11. jQuery发送AJAX请求

首先需要引入jQuery资源

11.1 发送GET请求

app.get('/jquery', (request, response)  => {// 设置响应头  设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 响应头response.setHeader('Access-Control-Allow-Headers', '*')  // 所有类型的头信息都可以接受response.send("hello jQuery AJAX")
})

 

$("#btn1").click(function() {// 第一个参数是url, 第二个参数是发送的参数(对象的形式), 第三个参数是回调函数$.get("http://localhost:9090/jquery", {a:100, b:200}, function(data, status) {console.log(data)})
})

 

 

11.2 发送POST请求

app.post('/jquery', (request, response)  => {// 设置响应头  设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 响应头response.setHeader('Access-Control-Allow-Headers', '*')  // 所有类型的头信息都可以接受response.send("hello jQuery AJAX POST")
})
$("#btn2").click(function() {$.post("http://localhost:9090/jquery", {a:100, b:200}, function(data, status) {console.log(data)})
})

POST请求携带的参数不会跟在url后面 

11.3  设置响应体的数据类型

/* jQuery服务 */
app.all('/jquery', (request, response)  => {// 设置响应头  设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 响应头response.setHeader('Access-Control-Allow-Headers', '*')  // 所有类型的头信息都可以接受const data = {name: "xiexu", age: 20}response.send(JSON.stringify(data))
})

服务端发送json格式的数据

 

 

11.4 jQuery通用方法发送AJAX请求

 

 

12. Axios发送AJAX请求

首先需要引入axios工具包 

 12.1 发送GET请求

app.get('/axios', (request, response)  => {// 设置响应头  设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 响应头response.setHeader('Access-Control-Allow-Headers', '*')  // 所有类型的头信息都可以接受response.send("hello Axios AJAX")
})

获取的数据是比较完整的

 

12.2 发送POST请求

 

/* axios 服务*/
app.all('/axios', (request, response)  => {// 设置响应头  设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 响应头response.setHeader('Access-Control-Allow-Headers', '*')  // 所有类型的头信息都可以接受response.send("hello Axios AJAX POST")
})

 

12.3 Axios通用方式发送AJAX请求

 

 

13. fetch() 函数发送AJAX请求 

/* fetch */
app.all('/fetch', (request, response)  => {// 设置响应头  设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 响应头response.setHeader('Access-Control-Allow-Headers', '*')  // 所有类型的头信息都可以接受const data = {name: "x666", age: 20}// response.send("hello jQuery AJAX")response.send(JSON.stringify(data))
})

 

 

 

 14. 解决跨域问题

同源策略是最早由Netscape公司提出,是浏览器的一种安全策略

同源:协议、域名、端口号必须相同;  违背同源策略就是跨域

解决跨域的方法:

14.1 JSONP

JSONP是一个非官方的跨域解决方案,只支持get请求

(1)JSONP是怎么工作的?

在网页中,由一些标签天生具有跨域的能力,比如img、link、iframe、script,JSONP就是利用script标签的跨域能力来发送请求的

(2)JSONP实现原理

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>jsonp解决跨域问题</title>
</head>
<body><script src="http://localhost:9090/jsonp"></script>
</body>
</html>
app.all('/jsonp', (request, response)  => {response.send("hello jsonp")
})

 

 这个原因就是我正儿八经的script标签向你发送请求,你却返回一个字符串的形式,我们应该返回的是函数的调用,也就是js的代码,这样浏览器才能执行里面的内容

 

 

 

14.2 原生JSONP的实现

需求:有一个输入框,在里面输入用户名,输完之后,我会失去焦点,失去焦点的时候,就会向服务端发送请求,对用户名是否存在的检测,因为这边没有数据库,所以服务端直接返回一个已存在,结果回来之后了,我们作一个判断,再把input框的颜色变为红色

 

/* 用户名检测是否存在 */
app.all('/checkUserName', (request, response)  => {const data = {exists: 1,msg: "用户名已存在"}let str = JSON.stringify(data)response.send(`handle(${str})`)
})

 

 

14.3 jQuery发送JSONP请求

需求:点击按钮,向服务端发送请求,响应的结果再div盒子中呈现

 

 

 

14.4 设置CORS响应头实现跨域

(1)CORS是什么?

CORS(Cross-Origin Resource Sharing), 跨域资源共享。CORS是官方的跨域解决方案,它的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持get和post请求。跨域资源共享标准新增了一组HTTP首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。

(2)CORS是怎么工作的?

CORS通过设置一个响应头告诉浏览器,请允许跨域,浏览器收到该响应以后就会对响应放行

 

 

修改:添加响应头

 

 成功响应:

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

超维空间S2无人机使用说明书——51、基础版——使用yolov8进行目标跟踪

引言&#xff1a;为了提高yolo识别的质量&#xff0c;提高了yolo的版本&#xff0c;改用yolov8进行物体识别&#xff0c;同时系统兼容了低版本的yolo&#xff0c;包括基于C的yolov3和yolov4&#xff0c;以及yolov7。 简介&#xff0c;为了提高识别速度&#xff0c;系统采用了G…

Vue小练习--任务列表

这是一个非常实用的例子&#xff0c;主要实用的是v-model、v-on、v-for指令&#xff0c;javaScript的数组也会涉及一些&#xff0c;javaScript数组方法有很多&#xff0c;本文使用的添加元素和删除元素非常实用&#xff0c;可以记下来。 设计思路 很多例子看起来很难&#xf…

使用Google OSV工具扫描依赖安全漏洞

安全漏洞是软件工程化能力的试金石 2021年年底&#xff0c;Log4j的漏洞陆续被公开。因为该框架被大量的开源软件依赖&#xff0c;所以&#xff0c;漏洞影响面非常大。 面对这个漏洞&#xff0c;我们遇到的第一个问题是&#xff1a;如何知道我们哪些工程使用了Log4j&#xff1f;…

用python画最简单的图案,用python画小猫简单代码

本篇文章给大家谈谈用python画小猫简单100行代码&#xff0c;以及用python画最简单的图案&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 Source code download: 本文相关源码 from turtle import * #两个函数用于画心 defcurvemove():for i in range(200): …

电池充电器、监控器和控制器AD7284WBSWZ、LT8490EUKJ、LTC4162EUFD-FAD、LTC4162IUFD-LAD【电源管理】

1、AD7284WBSWZ 8通道锂离子电池监控系统 IC 64LQFP AD7284 8通道锂离子电池监控系统包括对堆叠式锂离子电池进行通用监控所需的全部功能。AD7284具有支持四到八个电池管理单元的多路复用单元电压和辅助模数转换器 (ADC) 测量通道。设计人员可以使用四个辅助ADC输入通道进行温…

lag-llama源码解读(Lag-Llama: Towards Foundation Models for Time Series Forecasting)

Lag-Llama: Towards Foundation Models for Time Series Forecasting 文章内容&#xff1a; 时间序列预测任务&#xff0c;单变量预测单变量&#xff0c;基于Llama大模型&#xff0c;在zero-shot场景下模型表现优异。创新点&#xff0c;引入滞后特征作为协变量来进行预测。 获得…

Power Apps 学习笔记 - IOrganizationService Interface

文章目录 1. IOrganization Interface1.1 基本介绍1.2 方法分析 2. Entity对象2.1 Constructor2.2 Properties2.3 Methods 3. 相关方法3.1 单行查询 Retrive3.2 多行查询 RetriveMultiple3.3 增加 Create3.4 删除 Delete3.5 修改 Update 1. IOrganization Interface 1.1 基本介…

rax3000m刷openwrt固件

rax3000m刷机过程&#xff08;nand版本&#xff09; 刷机准备文件https://www.123pan.com/s/X5m9-6Ynj.html提取码:VtBW 接线关系&#xff1a;路由器lan口接电脑 1.上传配置开启ssh的配置文件&#xff08;登录路由器后台管理界面在找到配置管理&#xff0c;上传配置文件rax3…

[NCTF 2022] web题解

[NCTF 2022]calc 考点&#xff1a;python环境变量注入 打开题目&#xff0c;F12有hint 访问一下得到源码 app.route("/calc",methods[GET]) def calc():ip request.remote_addrnum request.values.get("num")log "echo {0} {1} {2}> ./tmp/log…

【Unity美术】Unity工程师对3D模型需要达到的了解【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

后端程序员React初接触1

后端程序员React初接触 学习react基础与相关库的使用学习 包括react基础 路由 组件库等等 react是用于构建用户界面的JavaScript库 发送请求获取数据处理数据操作dom呈现页面&#xff08;react帮忙操作dom&#xff09; 数据渲染为视图 有facebook打造并开源 解决的问题 dom操…

集群部署篇--Redis 哨兵模式

文章目录 前言一、哨兵模式介绍&#xff1a;1.1 介绍&#xff1a;1.2 工作机制&#xff1a; 二、哨兵模式搭建&#xff1a;2. 1 redis 主从搭建&#xff1a;2.2 setinel 集群搭建&#xff1a;2.2.1 配置&#xff1a; sentinel.conf &#xff1a;2.2.2 运行容器&#xff1a;2.2.…

jQuery日历签到插件下载

jQuery日历签到插件下载-遇见你与你分享

【MySQL】数据库之存储过程(“SQL语句的脚本“)

目录 一、什么是存储过程&#xff1f; 二、存储过程的作用 三、如何创建、调用、查看、删除、修改存储过程 四、存储过程的参数&#xff08;输入参数&#xff0c;输出参数&#xff0c;输入输出参数&#xff09; 第一种&#xff1a;输入参数 第二种&#xff1a;输出参数 …

Leetcode算法系列| 10. 正则表达式匹配

目录 1.题目2.题解C# 解法一&#xff1a;分段匹配法C# 解法二&#xff1a;回溯法C# 解法三&#xff1a;动态规划 1.题目 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 1.‘.’ 匹配任意单个字符 2.‘.’ 匹配任意单个字…

【DevOps 工具链】日志管理工具 - 22种 选型(读这一篇就够了)

文章目录 1、简述2、内容分类3、归纳对比表&#xff08;排序不分先后&#xff09;4、日志管理主要目的5、日志管理工具 22种 详细&#xff08;排序不分先后&#xff09;5.1、ManageEngine EventLog Analyzer5.1.1、简介5.1.2、效果图5.1.3、日志管理架构5.1.4、EventLog Analyz…

HarmonyOS 路由传参

本文 我们来说两个page界面间的数据传递 路由跳转 router.pushUrl 之前我们用了不少了 但是我们只用了它的第一个参数 url 其实他还有个params参数 我们第一个组件可以编写代码如下 import router from ohos.router Entry Component struct Index {build() {Row() {Column() …

交互式笔记Jupyter Notebook本地部署并实现公网远程访问内网服务器

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下…

C编程指针篇----包括历年真题

一&#xff0c;&#xff08;20年&#xff09;用指针字符逆序 代码&#xff1a; int main() {char s[7] "monkey", * p1, * p2, c;p1 p2 s;while (*p2) p2;p2--;while (p2 > p1) {c *p1; *p1 *p2; *p2-- c; }printf("%s", s);return 0; } 运行结…

【华为机试】2023年真题B卷(python)-解密犯罪时间

一、题目 题目描述&#xff1a; 警察在侦破一个案件时&#xff0c;得到了线人给出的可能犯罪时间&#xff0c;形如 “HH:MM” 表示的时刻。 根据警察和线人的约定&#xff0c;为了隐蔽&#xff0c;该时间是修改过的&#xff0c;解密规则为&#xff1a; 利用当前出现过的数字&am…