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

AJAX(一)HTTP协议(请求响应报文),AJAX发送请求,请求问题处理

文章目录

  • 一、AJAX
  • 二、HTTP协议
    • 1. 请求报文
    • 2. 响应报文
  • 三、AJAX案例准备
    • 1. 安装node
    • 2. Express搭建服务器
    • 3. 安装nodemon实现自动重启
  • 四、AJAX发送请求
    • 1. GET请求
    • 2. POST请求
      • (1) 配置请求体
      • (2) 配置请求头
    • 3. 响应JSON数据的两种方式
      • (1) 手动,JSON.parse()
      • (2) 设置xhr.responseType
  • 五、AJAX请求问题处理
    • 1. IE浏览器缓存的问题
    • 2. AJAX请求超时与网络异常
    • 3. 手动取消请求
    • 4. 请求重复发送的问题

ajax在网页不刷新的情况下发送http请求,获取http响应。

可实现懒加载,用则加载,不用则不加载

一、AJAX

AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。
通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据

优点

  1. 可以无需刷新页面而与服务器端进行通信。
  2. 允许根据用户事件来更新部分页面内容。

缺点

  1. 没有浏览历史,不能回退
  2. 存在跨域问题(同源)
  3. SEO (Search Engine Optimization,搜索引擎优化) 不友好。网页当时的内容爬虫是爬不到的,比如要在商品列表,爬取某一商品的详细信息。此时页面并没有这个详细信息,详细信息是点击商品之后通过ajax请求获取到的。

二、HTTP协议

HTTP(hypertext transport protocol)协议(超文本传输协议),协议详细规定了浏览器和万维网服务器之间互相通信的规则。这个协议其实就是一种规定,通信都按着这个规定来。

1. 请求报文

客户端向浏览器发送的内容叫请求报文,请求报文包括四部分:
①请求行 : 请求类型(GET/POST) + URL地址 + HTTP协议版本(HTTP/1.1)
②请求头:(内容不用记,记得格式是键值对就行)

Host: atguigu.com
Cookie: name=guigu
Content-type: application/x-www-form-urlencoded
User-Agent: chrome 83

③空行:必须要有的
④请求体:若为GET请求则为空。若为POST请求,可以不为空

2. 响应报文

浏览器向客户端返回的结果叫响应报文,也包括四部分:
①响应行 : HTTP协议版本(HTTP/1.1) + 响应状态码(200) + 响应状态字符串(ok)
②响应头:(格式与请求头一样)

Content-Type: text/html;charset=utf-8
Content-length: 2048
Content-encoding: gzip

③空行:必须要有的
④响应体:服务器的返回结果

三、AJAX案例准备

1. 安装node

学vue的时候安装过,具体见博客:Vue安装脚手架及一些配置

2. Express搭建服务器

用ajax向服务器发请求。我们就用express搭建一个简易的服务器。
(1) 先初始化一下项目
ajax文件夹下执行下面的命令,生成package.json文件

npm init --yes

(2) 安装express
在ajax文件夹下执行命令,安装express

npm i express

(3) 配置服务器
创建文件夹AJAX/express.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')
})// 4. 监听端口服务器
app.listen(8000, () => {console.log('服务已经启动,8000端口监听中....');
})

目前的目录结构为:
在这里插入图片描述
(4) 启动服务器
注意要在该js文件所在的文件夹下打开终端,否则运行命令时找不到这个js文件
在这里插入图片描述
在终端输入命令,启动服务器,
在这里插入图片描述
网页运行测试:
在这里插入图片描述

3. 安装nodemon实现自动重启

每次修改服务器的js文件都要重启服务器,很麻烦,安装nidemon可以自动重启服务器。
安装:npm install -g nodemon
启动服务器:nodemon 文件名.js
在这里插入图片描述

四、AJAX发送请求

XMLHttpRequest, AJAX 的所有操作都是通过该对象进行的。

1. GET请求

在服务器文件中配置get响应接口,再往这个接口发请求。
server.js:

app.get('/server', (request, response) => {// 设置响应头 设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 设置响应体response.send('HELLO AJAX')
})

页面结构
在这里插入图片描述

  // 获取元素const btn = document.querySelector('#btn')const div = document.querySelector('#content')// 监听点击事件btn.addEventListener('click', () => {// 1. 创建对象const xhr = new XMLHttpRequest();// 2. 初始化,设置请求方法和urlxhr.open('GET', 'http://localhost:8000/server');// 3. 发送请求xhr.send()// 4. 事件绑定处理服务器返回的结果// readystate是xhr属性,表示状态0,1,2,3,4 当状态改变时这个函数被调用xhr.onreadystatechange = function () {if (xhr.readyState === 4) {// 判断响应码 200 404 403// 响应码是2xx,则请求成功if (xhr.status >= 200 && xhr.status < 300) {console.log('状态码:', xhr.status);console.log('状态字符串:', xhr.statusText);console.log('响应头:', xhr.getAllResponseHeaders());console.log('响应体:', xhr.response);// 将响应结果渲染到页面div.innerHTML = xhr.response}}}})

四个状态值分别表示:
0:未初始化;1:open方法已被调用;2:send方法已被调用
3:服务端返回部分结果;4:服务端返回全部结果;
在这里插入图片描述
GET请求携带参数的方式:url?a=10&b=20&c=30,参数会成为请求地址的一部分
在这里插入图片描述

2. POST请求

(1) 配置请求体

POST请求设置请求体在send()函数里设置,可配置一些请求参数。这样参数不会成功地址URL的一部分。请求体里的内容格式可以随便写,前提是服务端要有对应的处理方式。

// 发送POST请求
btnPost.addEventListener('click', () => {// 1. 创建对象const xhr = new XMLHttpRequest();// 2. 初始化,设置请求方法和urlxhr.open('POST', 'http://localhost:8000/server');// 3. 发送请求 请求体可以是任意形式// xhr.send(1234567)// xhr.send('a:100&b:200&c:300')xhr.send('a=100&b=200&c=300')// 4. 处理服务器返回的结果xhr.onreadystatechange = function () {if (xhr.readyState === 4) {// 请求成功if (xhr.status >= 200 && xhr.status < 300) {div.innerHTML = xhr.response}}}
})

server.js配置post请求接口

app.post('/server', (request, response) => {// 设置响应头 设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 设置响应体response.send('HELLO AJAX POST')
})

(2) 配置请求头

在open方法下写setRequestHeader属性,配置请求头
在这里插入图片描述
能否发送请求头,能否发送自定义的请求头,都需要服务器端进行设置。
这里的重点是怎么配置请求头。服务器端的设置不是重点。

server.js

// all可接收get、post等所有形式的请求
app.all('/server', (request, response) => {// 设置响应头 设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 接收任何响应头response.setHeader('Access-Control-Allow-Headers', '*')// 设置响应体response.send('HELLO AJAX POST')
})

在这里插入图片描述

3. 响应JSON数据的两种方式

服务器:

// all可接收get、post等所有形式的请求
app.all('/server', (request, response) => {// 设置响应头 设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')const data = { name: 'tom' }// 设置响应体response.send(JSON.stringify(data))
})

客户端:

 // 4. 处理服务器返回的结果xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {console.log('返回结果:', xhr.response); //返回结果: {"name":"tom"}}}}

服务器返回一个JSON数据,如果不处理,浏览器接收到的就是字符串。

(1) 手动,JSON.parse()

在这里插入图片描述
在这里插入图片描述

(2) 设置xhr.responseType

在这里插入图片描述

五、AJAX请求问题处理

1. IE浏览器缓存的问题

server.js

app.all('/ie', (request, response) => {// 设置响应头 设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 设置响应体// response.send('Hello IE')response.send('Hello ie')
})

发送请求,获取响应结果Hello IE;更改server.js的响应体后,IE浏览器再次发送请求,获取到的响应结果还是Hello IE;因此他走的是缓存。
解决方法:
在这里插入图片描述
在地址URL上配置一个时间戳,这样每次发送请求时,地址都不一样,IE就会认为是新的请求,就不会走缓存了。
在这里插入图片描述

2. AJAX请求超时与网络异常

timeout 设置请求的时间,请求超过这个时间则会出现请求超时异常;xhr.ontimeout回调函数对请求超时进行处理。
xhr.onerror对网络异常进行处理(比如没网)

btn.addEventListener('click', () => {// 1. 创建对象const xhr = new XMLHttpRequest();// 超时回调,2sxhr.timeout = 2000xhr.ontimeout = function () {alert('请求超时')}// 网络异常回调xhr.onerror = function () {alert('网络出问题了')}// 超时设置xhr.open('GET', 'http://localhost:8000/delay')xhr.send()
})

服务器可写一个定时器模拟请求延时

// 网络请求超时
app.all('/delay', (request, response) => {// 设置响应头 设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 设置响应体setTimeout(() => {response.send('Hello')}, 5000)
})

3. 手动取消请求

取消发送请求xhr.abort()
浏览器端定义两个按钮

 <button id="btn">发送请求</button><button id="cancel">取消发送请求</button>

注意xhr作用域的问题:

 // 获取元素const btn = document.querySelector('#btn')const cancel = document.querySelector('#cancel')let xhr = null// 发送GET请求btn.addEventListener('click', () => {xhr = new XMLHttpRequest();xhr.open('GET', 'http://localhost:8000/cancel')xhr.send()xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {console.log(xhr.response);}}}})// 取消请求cancel.addEventListener('click', () => {xhr.abort()})

在这里插入图片描述
当请求处于发送中状态时,点击取消请求,可取消请求。

4. 请求重复发送的问题

当用户一直点击按钮,一直向服务器发送同一个请求,服务器压力会很大,影响性能。
思路就是在重新要发请求2时,判断是否已经有请求1,如果有,则取消1发送2。

  // 获取元素const btn = document.querySelector('#btn')let xhr = nulllet isSending = false // 是否正在发送// 发送GET请求btn.addEventListener('click', () => {// 如果当前有发送的请求,则取消if (isSending) {xhr.abort()}// 创建对象xhr = new XMLHttpRequest();// 修改标识变量isSending = truexhr.open('GET', 'http://localhost:8000/delay')xhr.send()xhr.onreadystatechange = function () {if (xhr.readyState === 4) {// 请求结束isSending = false}}})

相关文章:

AJAX(一)HTTP协议(请求响应报文),AJAX发送请求,请求问题处理

文章目录 一、AJAX二、HTTP协议1. 请求报文2. 响应报文 三、AJAX案例准备1. 安装node2. Express搭建服务器3. 安装nodemon实现自动重启 四、AJAX发送请求1. GET请求2. POST请求(1) 配置请求体(2) 配置请求头 3. 响应JSON数据的两种方式(1) 手动&#xff0c;JSON.parse()(2) 设置…...

Git进阶(十五):Git LFS 使用详解

文章目录 一、介绍二、Git LFS 使用步骤三、场景示例四、拓展阅读 一、介绍 Git LFS (Large File Storage) 是一个 Git 扩展&#xff0c;它使 Git 更适合处理大型文件&#xff0c;如音频、视频、图像或任何其他二进制大文件。Git LFS 替换仓库中的大文件为文本指针文件&#x…...

操作系统 | 学习笔记 | | 王道 | 5.1 I/O管理概述

5.1 I/O管理概述 5.1.1 I/O设备 注&#xff1a;块设备可以寻址&#xff0c;但是字符设备是不可寻址的 I/O设备是将数据输入到计算机中&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件&#xff1b; 设备的分类 按使用特性分类&#xff…...

关于es的一个多集群、多索引切换的实现

首先是封装了一个类里定义了关于集群名称和集群节点&#xff1b;以及关于索引的名称和集群的名称做一个关联&#xff1b;将多个集群封装存储得到类中 /*** es集群类*/ Data public class EsClusterConfig implements Serializable {/*** 集群名称*/private String name;/*** 集…...

Linux系统编程(基础指令)上

1.Linux常见目录介绍 Linux目录为树形结构 /&#xff1a;根目录&#xff0c;一般根目录下只存放目录&#xff0c;在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”&#xff0c;你其实是在告诉电脑&#xff0c;先从/&#xff08;根目录&…...

【STM32 Blue Pill编程】-定时器PWM模式

定时器PWM模式 文章目录 定时器PWM模式1、定时器PWM模式介绍2、硬件准备及接线3、模块配置4、代码实现在文中,我们将介绍如何使用 STM32 Blue Pill 定时器的PWM模式以及如何配置它们以生成具有不同占空比和频率的信号。 我们将使用 LED调光器示例来演示如何使用 STM32Cube IDE…...

数字英文验证码识别 API 对接说明

数字英文验证码识别 API 对接说明 本文将介绍一种 数字英文验证码识别 API 对接说明&#xff0c;它是基于深度学习技术&#xff0c;可用于识别变长英文数字验证码。输入验证码图像的内容&#xff0c;输出验证码结果。 接下来介绍下 数字英文验证码识别 API 的对接说明。 注册…...

稳了,搭建Docker国内源图文教程

大家好&#xff0c;之前分享了我的开源作品 Cloudflare Workers Proxy&#xff0c;它的作用是代理被屏蔽的地址&#xff0c;理论上支持代理任何被屏蔽的域名&#xff0c;使用方式也很简单&#xff0c;只需要设置环境变量 PROXY_HOSTNAME 为被屏蔽的域名&#xff0c;最后通过你的…...

零工市场小程序:推动零工市场建设

人力资源和社会保障部在2024年4月发布了标题为《地方推进零工市场建设经验做法》的文章。 零工市场小程序的功能 信息登记与发布 精准匹配、推送 在线沟通 权益保障 零工市场小程序作为一个找零工的渠道&#xff0c;在往后随着技术的发展和政策的支持下&#xff0c;功能必然…...

回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量…...

VCNet论文阅读笔记

VCNet论文阅读笔记 0、基本信息 信息细节英文题目VCNet and Functional Targeted Regularization For Learning Causal Effects of Continuous Treatments翻译VCNet和功能目标正则化用于学习连续处理的因果效应单位芝加哥大学年份2021论文链接[2103.07861] VCNet和功能定向正…...

Python 装饰器使用详解

文章目录 0. 引言1. 什么是装饰器&#xff1f;2. 装饰器的基本语法3. 装饰器的工作原理4. 常见装饰器应用场景4.1. 日志记录4.2. 权限校验4.3. 缓存 5. 多重装饰器的执行顺序6. 装饰器的高级用法6.1. 带参数的装饰器6.2. 使用 functools.wraps6.3. 类装饰器 7. 图示说明7.1. 单…...

Vue使用qrcodejs2-fix生成网页二维码

安装qrcodejs2-fix npm install qrcodejs2-fix核心代码 在指定父view中生成一个二维码通过id找到父布局 //通过id找到父布局let codeView document.getElementById("qrcode")new QRCode(codeView, {text: "测试",width: 128,height: 128,colorDark: #00…...

兼容多个AI应用接口,支持用户自定义切换AI接口

项目背景 2023年ChatGPT横空出世&#xff0c;给IT行业造成了巨大的反响。我第一次发现这个ChatGPT有着如此神奇的功能&#xff08;智能对话&#xff0c;知识问答&#xff0c;代码生成&#xff0c;逻辑推理等&#xff09;&#xff0c;我感到非常吃惊&#xff01;经过一番学习和…...

[docker]入门

本文章主要讲述的是&#xff0c;docker基本实现原理&#xff0c;docker概念的解释&#xff0c;docker的使用场景以及docker打包与部署的应用。 文章中docker所运行的系统&#xff1a;CentOS Linux release 7.9.2009 (Core) 目录 docker是什么&#xff0c;什么时候需要去使用 …...

《让手机秒变超级电脑!ToDesk云电脑、易腾云、青椒云移动端评测》

前言 科技发展到如今2024年&#xff0c;可以说每一年都在发生翻天覆地的变化。而云上这个词时常都被大家提起&#xff0c;从个人设备连接到云端在如今在也不是梦了。而云电脑这个市场近年来迅速发展&#xff0c;无需购买和维护额外的硬件就可以体验到电脑端顶配的性能和体验&am…...

Nginx处理带有分号“;“的路径

一、背景 安全渗透测试发现springboot 未授权访问的actuator和Swagger-ui 信息泄露的漏洞&#xff0c;需要规避。解决方案中较简单的就是通过Nginx将相关的接口转发到403页面。 在配置的过程当中&#xff0c;遇到了带有…;的路径&#xff1a;http://{ip:port}/{path}/…;/actu…...

Spring Boot框架下的心理教育辅导系统开发

1绪 论 1.1研究背景 随着计算机和网络技术的不断发展&#xff0c;计算机网络已经逐渐深入人们的生活&#xff0c;网络已经能够覆盖我们生活的每一个角落&#xff0c;给用户的网上交流和学习提供了巨大的方便。 当今社会处在一个高速发展的信息时代&#xff0c;计算机网络的发展…...

PyTorch 图像分割模型教程

PyTorch 图像分割模型教程 在图像分割任务中&#xff0c;目标是将图像的每个像素归类为某一类&#xff0c;以分割出特定的物体。PyTorch 提供了非常灵活的工具&#xff0c;可以用于构建和训练图像分割模型。我们将使用 PyTorch 的经典网络架构&#xff0c;如 UNet 和 DeepLabV…...

物联网——USART协议

接口 串口通信 硬件电路 电平标准 串口参数、时序 USART USART主要框图 TXE: 判断发送寄存器是否为空 RXNE: 判断接收寄存器是否非空 RTS为输出信号&#xff0c;用于表示MCU串口是否准备好接收数据&#xff0c;若输出信号为低电平&#xff0c;则说明MCU串口可以接收数据&#…...

前端框架对比与选择:如何在现代Web开发中做出最佳决策

随着互联网技术的迅速发展&#xff0c;前端开发在现代Web应用开发中扮演了至关重要的角色。对于开发者来说&#xff0c;选择合适的前端框架不仅能够提高开发效率&#xff0c;还能确保项目的可维护性和可扩展性。目前市面上有多种主流的前端框架和库&#xff0c;每一种都有其独特…...

【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例

【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例 前言问题描述控制方程及数值方法浅水方程及其数值计算方法边界条件的实现 代码框架与关键代码模拟结果 更新于2024年9月17日 前言 这篇博客算是学习浅水方程&#xff0c;并利用MATLAB复刻Liang (2004)1中溃坝流算例的一个记录…...

探索云计算:IT行业的未来趋势

探索云计算&#xff1a;IT行业的未来趋势 在当今快速发展的科技世界&#xff0c;云计算已成为IT行业的核心趋势之一。无论是大企业还是初创公司&#xff0c;越来越多的组织正在转向云计算&#xff0c;以实现更高效的运营和更快的创新。在这篇博文中&#xff0c;我们将探讨云计算…...

[PICO VR眼镜]眼动追踪串流Unity开发与使用方法,眼动追踪打包报错问题解决(Eye Tracking/手势跟踪)

前言 最近在做一个工作需要用到PICO4 Enterprise VR头盔里的眼动追踪功能&#xff0c;但是遇到了如下问题&#xff1a; 在Unity里面没法串流调试眼动追踪功能&#xff0c;根本获取不到Device&#xff0c;只能将整个场景build成APK&#xff0c;安装到头盔里&#xff0c;才能在…...

一周热门|比GPT-4强100倍,OpenAI有望年底发布GPT-Next;1个GPU,1分钟,16K图像

大模型周报将从【企业动态】【技术前瞻】【政策法规】【专家观点】四部分&#xff0c;带你快速跟进大模型行业热门动态。 01 企业动态 Ilya 新公司 SSI 官宣融资 10 亿美元 据路透社报道&#xff0c;由 OpenAI 联合创始人、前首席科学家 Ilya Sutskever 在 2 个多月前共同创…...

软考流水线计算

某计算机系统输入/输出采用双缓冲工作方式&#xff0c;其工作过程如下图所示&#xff0c;假设磁盘块与缓冲区大小相同&#xff0c;每个盘块读入缓冲区的时间T为10μs&#xff0c;由缓冲区送至用户区的时间M为6μs&#xff0c;系统对每个磁盘块数据的处理时间C为2μs。若用户需要…...

1份可以派上用场丢失数据恢复的应用程序列表

无论如何&#xff0c;丢失您的宝贵数据是可怕的。您的 Android 或 iOS 设备可能由于事故、硬件损坏、存储卡问题等而丢失了数据。这就是为什么我们编制了一份可以派上用场以恢复丢失数据的应用程序列表。 如果您四处走动&#xff0c;您大多会随身携带手机或其他移动设备。这些…...

MySQL Workbench 超详细安装教程(一步一图解,保姆级安装)

前言&#xff1a; MySQL Workbench 是一款强大的数据库设计和管理工具&#xff0c;它提供了图形化界面&#xff0c;使得数据库的设计、管理、查询等操作变得更加直观和便捷。本文将详细介绍如何在 Windows 系统上安装 MySQL Workbench。相信读者看这篇文章前一定安装了MySQL数…...

深度学习常见面试题及答案(16~20)

算法学习、4对1辅导、论文辅导或核心期刊以及其他学习资源可以通过公众号滴滴我 文章目录 16. 简述深度学习中的批量归一化&#xff08;Batch Normalization&#xff09;的目的和工作原理。一、批量归一化的目的1. 加速训练收敛&#xff1a;2. 提高模型泛化能力&#xff1a;3. …...

Packet Tracer - IPv4 ACL 的实施挑战(完美解析)

目标 在路由器上配置命名的标准ACL。 在路由器上配置命名的扩展ACL。 在路由器上配置扩展ACL来满足特定的 通信需求。 配置ACL来控制对网络设备终端线路的 访问。 在适当的路由器接口上&#xff0c;在适当的方向上 配置ACL。…...