Ajax的应用

news2024/11/24 16:57:27

1. Ajax

Ajax是Asynchronous Javascript And XML(异步JavaScript和XML)的缩写。

Ajax技术描述了使用脚本操纵HTTP和Web服务器进行数据交换,在页面不刷新的情况下,实现页面的局部更新。

重点:

  • Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

  • 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

  • 传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。

1.1 创建XMLHttpRequest对象

浏览器在XMLHttpRequest类上定义了它的HTTP方法。这个类型的每个实例都表示一个独立的请求/响应对,并且这个对象的属性和方法允许指定请求细节和获取相应数据。

创建XMLHttpRequest对象:

var xhr = new XMLHttpRequest();

回忆:

一个HTTP请求由4部分组成:

  • HTTP请求方法(GET/POST等)

  • 请求的URL

  • 一个可选的请求头集合,其中可能包含身份验证信息

  • 一个可选的请求主体

1.2 Ajax向服务器发送请求

创建XMLHttpRequest对象之后,我们就可以使用XMLHttpRequest对象的open()方法发起请求,该方法必须要指定请求方法(GET、POST等)和URL。

xhr.open("GET", "home.html");
xhr.open('method', 'URL' [, asyncFlag [, 'userName' [, 'password']]])
  • method:用于指定请求方式,如GET、POST,不区分大小写。 URL:表示请求的地址。 asyncFlag:可选参数,用于指定请求方式,同步请求为false,默认为异步请求true。 userName和password:可选参数,表示HTTP认证的用户名和密码。

  • 请求方法不区分大小写,但通常都写成大写的形式。除了"GET"和"POST"之外,该方法还支持"DELETE"、"HEAD"、"OPTIONS"和"PUT"作为第一个参数。但"TRACE"和 "CONNECT"由于安全风险已被明确禁止使用。

  • URL用来指定请求的资源。它可以是一个相对URL(相对于当前文档的URL),也可以是一个绝对URL。如果使用的是绝对URL,则协议、主机和端口通常必须要与当前文档URL保持一致,因为跨域的请求通常会报错(在服务器允许跨域请求时,则不会报错)。

注意:

同步和异步的区别:是否阻塞代码的执行。

异步方式(默认):是非阻塞的,浏览器端的JavaScript程序不用等待Web服务器响应,可以继续处理其他事情。当服务器响应后,再来处理Ajax对象获取到的响应结果。下面请看异步的执行过程,

同步方式:是阻塞的,当Ajax对象向Web服务器发送请求后,会等待Web服务器响应的数据接收完成,再继续执行后面的代码。

1.3 设置http请求头

除了设置请求方法和URL以外,我们还可以设置请求头。POST请求一般是要用"Content-Type"请求头指定请求主体的MIME类型(用来描述实体内容的编码格式):

xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");//默认编码格式(数据被编码为名称/值对) 
xhr.setRequestHeader("Content-Type", "application/json");//用来告诉服务端消息主体是序列化后的 JSON 字符串

扩展阅读:Form表单的编码类型

但是有些请求头我们不能自己指定,例如"Content-Length"、"Date"、"Referer"、"User-Agent"等,XMLHttpRequest将自动添加这些头,防止伪造它们。除此之外,XMLHttpRequest对象自动处理Cookie、连接时间、字符集和编码判断,所以我们无法向setRequestHeader()传递如下的请求头:

Accept-CharsetContent-Transfer-EncodingTE
Accept-EncodingDateTrailer
ConnectionExpectTransfer-Encoding
Content-LengthHostUpgrade
CookieKeep-aliveUser-Agent
Cookie2RefererVia

1.4 发送请求

使用XMLHttpRequest发起请求的最后一步是指定可选的请求主体并将它发送给服务器。

xhr.send(content);//Open的方式是post
xhr.send(null);//open的方式是get的一般不用send
//xhr.send('clazz=火花&name=张三&gender=男');

GET请求没有请求体,所以应该传递null或省略这个参数。而POST请求通常具有请求主体,同时它应该与使用setRequestHeader()指定的"Content-Type"一致。

1.5 获得响应

一个完整的HTTP响应消息由状态行、响应头、空行和响应主体组成。这些都可以通过XMLHttpRequest对象的方法和方法获取。

1.6 监听请求状态的改变

为了在响应准备就绪时得到通知,必须监听XMLHttpRequest对象上的onreadystatechange事件。

xhr.onreadystatechange = function(){
​
};

但为了理解这个事件类型,我需要先弄明白readyState属性。readyState属性的值是一个整数,用来指示HTTP请求的状态。readyState属性的值如下表所示:

常量含义
UNSENT0初始化,尚未调用open()方法
OPENED1启动,已调用open()方法,但尚未调用send()方法
HEADERS_RECEIVED2发送,已调用send()方法,接收到响应头信息
LOADING3接收中,已经接收到部分响应主体
DONE4完成,已经接收到全部响应数据,而且已经可以在客户端使用了

在实际应用中,当readyState属性的值改变为0或1时可能不会触发这个事件。当readyState属性的值改变为4或服务器的响应完成时,所有的浏览器都会触发readystatechange事件。因此为了判断响应是否真正完成了,我们应该在事件处理程序中时刻检测readyState属性的值。

xhr.onreadystatechange = function(){
if (xhr.readyState === 4) {
        console.log("请求完成了");
    }
};

但这样只能确保请求完成了,并不能确保请求成功。因此我们还需要根据响应的【状态码】来判断请求是否成功。

我们可以通过XMLHttpRequest对象的status和statusText属性获取HTTP状态码,状态消息。

xhr.status       // 200
xhr.statusText   // OK

代码如下:

xhr.onreadystatechange = function(){
if (xhr.readyState === 4 && xhr.status === 200) {
        console.log("请求完成并且成功了");
    }
};

完善的判断信息

xhr.onreadystatechange = function(){
    if (xhr.readyState === 4) {
            if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
                alert(xhr.responseText);
            } else {
                alert("Request was unsuccessful: " + xhr.status);
            };
        };
};

1.7 获取响应头

  • 响应头用于告知客户端本次响应的基本信息,包括服务器程序名、内容的编码格式、缓存控制等。请求头和响应头是浏览器和服务器之间交互的重要信息,由程序自动处理,通常不需要人为干预。

  • 使用getResponeHeader()和getAllResponeHeaders()获取响应头信息。

xhr.getResponeHeader("Content-Type")      // "text/html"
xhr.getAllResponeHeaders()              // 获取所有的响应头

1.8 获得响应主体

服务器的响应实体内容有多重编码格式,当用户请求的是一个网页,实体内容的格式就是HTML,如果请求的是图片响应的就是图片,服务器为了告知浏览器内容类型,会通过响应头中的Content-type字段来描述,这是一种MIME常见的类型。

无论响应主体内容类型是什么,响应主体的内容都会保存到responseText和responseXML属性中;而对于非XML数据而言responseXML属性的值将为null。

xhr.responseText     // 服务器端返回的文本内容

1.9 处理服务器返回的数据

服务器返回的数据都是JSON格式的字符串,为了使用方便,我们需要先把字符串转换成JavaScript对象(Object/Array)。

JSON.parse(xhr.responseText);

转换之后,就能以访问对象属性的方式拿到各种数据,实例如下:

// 转换成Object类型的对象
[{"id":"0001""name":"zhangsan","age":25,"gender":true,"phone":"12342344533"}]
​
// 转换成Array类型的对象
[
{"id":"0001""name":"zhangsan","age":25,"gender":true,"phone":"12342344533"},
{"id":"0001""name":"zhangsan","age":25,"gender":true,"phone":"12342344533"},
{"id":"0001""name":"zhangsan","age":25,"gender":true,"phone":"12342344533"},
{"id":"0001""name":"zhangsan","age":25,"gender":true,"phone":"12342344533"}
]

1.10 怎样向服务器传递数据?

GET方式的请求:

传递给后台的数据要拼接到URL的后面,以问号(?)开始,参数是以name=value的形式出现,每两个键值对之间以(&)分隔。例如:

'http://192.168.0.101:8080/AjaxDemo/LoginServlet?username=zhangsan&password=123456' 

POST方式的请求:

先通过请求头(Content-Type)指定数据的格式类型,常用的格式类型有两种,分别是:

  • application/x-www-form-urlencoded:用来告诉服务端消息主体是经过 URL编码的字符串(窗体数据被编码为名称/值对)

  • application/json :用来告诉服务端消息主体是序列化后的 JSON 格式的字符串

  • xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.setRequestHeader("Content-Type","application/json");
  
然后将编码之后的数据通过send()方法传递给服务器,例如:
​
xhr.send(“clazz=%E7%81%AB%E8%8A%B112%E6%9C%9F&name=%E9%99%88%E6%A2%A6%E9%BE%99&gender=%E7%94%B7&age=20&hobby=%E7%9D%A1%E8%A7%89&hobby=%E6%89%93%E8%B1%86%E8%B1%86&tel=13834569928&address=%E5%8D%97%E9%98%B3&remark=%E6%96%B0%E5%90%8C%E5%AD%A6&date=2019-08-01”)。

2. 接口文档

在实际的项目开发中,后台服务写好之后,后台人员会给前台人员一份【接口文档】,文档中列出了每个功能所需要的接口信息,我们前台人员只需要根据文档的要求与服务器进行数据交互即可。接口文档示例如下:

接口请求方式作用请求参数
/api/student/getStudentGET1、获取所有学生信息 2、根据ID获取学生信息 3、根据name获取学生信息可选参数: id 学生ID name 学生姓名
/api/student/removeStudentGET1、根据ID删除学生信息必传参数: id 学生ID
/api/student/addStudentPOST1、添加学生信息必传参数: clazz班级 name 姓名 gender 性别 age 年龄 tel 电话 address 地址信息 remark 备注信息
/api/student/updateStudentPOST1、更新学生信息必传参数:id 学生ID clazz班级 name 姓名 gender 性别 age 年龄 tel 电话 address 地址信息 remark 备注信息**

3. 开发模式

3.1 前后端混合

前端代码与后台代码混合编写,也就是说前端代码和后台代码同时出现在一个文件中。例如,index.php文件是由PHP代码和HTML代码混写的:

<!DOCTYPE html>
<html>
<body>
<?php
$x=5; // global scope
function myTest() {
   $y=10; // local scope
   echo "<p>在函数内部测试变量:</p>";
   echo "变量 x 是:$x";
   echo "<br>";
   echo "变量 y 是:$y";
} 
​
myTest();
​
echo "<p>在函数之外测试变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
?>
</body>
</html>
​
//再例如,index.jsp是由 Java代码和HTML代码混写的:
​
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<title>life.jsp</title>
</head>
<body>

在前后端不分离的时代,在项目开发阶段,前端人员负责编写HTML页,后端人员负责写接口,前端人员调试页面动态数据都需要后端人员的配合,不能单独调试,耗时耗力。前端把前后端代码存放于同一个代码库中,甚至是同一工程目录下。页面中还夹杂着后端代码。前后端工程师进行开发时,都必须把整个项目导入到开发工具中。

3.2 前后端分离

随着时代的发展,渐渐的许多大中小公司开始把前后端的界限分的越来越明确,前端工程师只管前端的事情,后端工程师只管后端的事情。

  • 前后端分离情形一

前端资源和后台接口位于同一个服务器

  • 前后端分离情形二

前台资源和后台接口分别位于不同的服务器(跨域)

3.3 跨域和同源策略

例如【前后端分离情形二】浏览器不允许一个服务器中的页面向另一个服务器发送请求,错误信息如下:

我们通常称这种类型的请求叫跨域请求

为什么会跨域呢?

  • 因为违背了同源策略的请求就形成了跨域。

那什么是同源策略呢?

是指协议,域名,端口号相同就称为同源,同源的请求是允许的,如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问,就造成了跨域。

那怎么样解决这个问题呢?

为使受信任的网站之间能够跨域访问,HTML5提供了一个新的策略,就是Access-Control-Allow-Origin响应头。目标服务器通过该响应头可以指定允许来自特定URL的跨域请求,其值可以设置为任意URL或特定URL等。

实现方式有:

1、通过设置后台服务器允许跨域请求

2、JSONP

3、使用代理服务器

4、前台使用代理

3.4 JSONP实现跨域请求

Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。我们可以通过使用 html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。这种跨域的通讯方式称为JSONP。

  • JSONP:遵循浏览器的同源策略基础上实现跨域请求的一种方式。 原理:与XMLHttpRequest无关,是利用<script>标签的src属性实现了跨域请求。 问题:在浏览器中, 哪些标签可以加载跨域资源? 答案:<script>、<img>、<iframe>、<link>等标签。

  • JSONP之所以采用<script>标签,是因为该标签加载的资源可以直接当做JavaScript代码执行,只要通过服务器端的配合,就可以传送数据。

    注意:

    JSONP本质上是加载了其他网站的脚本,这种方式存在安全风险,因为 其他网站可以利用JavaScript窃取用户信息,或更改页面内容。因此,在加载脚本前,一定确保对方是受信任的网站。

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

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

相关文章

服务器再升级!64线程服务器震撼上线,全新渲染体验等你来解锁

秉承着 “科技赋能创意&#xff0c;连接创造价值”的使命&#xff0c; 经过精心的策划和筹备&#xff0c; 蓝海创意云 64线程服务器&#xff0c; 以全新的面貌&#xff0c;优惠的价格&#xff0c; 与大家见面了&#xff01; 诚邀您一起&#xff0c;解锁全新的渲染体验&am…

如何利用AI绘图,生成同一人物(最好为二次元)的不同动作和不同表情的图片?

Ai绘画有一个很现实的问题&#xff0c;要保证每次画出的都是同一个人物的话&#xff0c;很费劲。 Midjourney就不必说了&#xff0c;人物的高度一致性一直得不到很好的解决。而在Stable Diffusion&#xff08;SD&#xff09;中&#xff0c;常用办法是通过同一个Seed值&#xf…

Android低代码开发 - InputMenuPanelItem详解

我们知道MenuPanel是一个菜单面板容器&#xff0c;它里面可以放各式各样的菜单和菜单组。今天我们就来详细讲解输入菜单这个东西。 InputMenuPanelItem源码 package dora.widget.panel.menuimport android.content.Context import android.text.Editable import android.text…

KEYSIGHT N1000A 采样示波器 支持哪些类型的示波器模块?

N1000A Keysight 高性能宽带宽示波器&#xff0c;它支持多种类型的模块&#xff0c;这些模块可以根据用户的需求进行选择和配置&#xff0c;以执行精密的光学、电气和TDR/TDT/S参数分析。以下是一些支持的模块类型&#xff1a; 光通信模块&#xff1a;这些模块支持深入的收发信…

量化、剪枝、蒸馏,这些大模型黑话到底说了些啥?

扎克伯格说&#xff0c;Llama3-8B还是太大了&#xff0c;不适合放到手机中&#xff0c;有什么办法&#xff1f; 量化、剪枝、蒸馏&#xff0c;如果你经常关注大语言模型&#xff0c;一定会看到这几个词&#xff0c;单看这几个字&#xff0c;我们很难理解它们都干了些什么&…

【图书推荐】《Spark入门与大数据分析实战》

本书重点 广告点击实时大数据分析、电影影评大数据分析&#xff0c;这两个综合项目适合作为课题论文、毕业论文素材&#xff0c;值得收藏。 内容简介 本书基于Spark 3.3.1框架展开&#xff0c;系统介绍Spark生态系统各组件的操作&#xff0c;以及相应的大数据分析方法。 本…

亿达四方:一站式SolidWorks代理服务,打造设计竞争力

在当今瞬息万变的设计与制造领域&#xff0c;高效、精准的3D设计软件已成为推动企业创新与发展的核心驱动力。作为业界知名的SolidWorks一站式代理服务商&#xff0c;亿达四方致力于为企业搭建从软件采购到技术应用的全方位桥梁&#xff0c;全面赋能设计团队&#xff0c;助力企…

如何保障生物制药企业,HPC环境下数据下载的安全性问题?

许多不同类型的公司和组织可能会使用高性能计算&#xff08;HPC&#xff09;来解决各种复杂的问题。制药和生物技术企业使用高性能计算&#xff08;HPC&#xff09;的方式多种多样&#xff0c;同时也涉及HPC环境下数据下载安全性问题的考量。主要包括以下几个方面&#xff1a; …

把裤袜换成黑丝(Stable Diffusion进阶篇: ComfyUI 局部重绘)

先让大伙打起精神来 局部重绘 局部重绘适用于那些对整个画面还比较满意&#xff0c;只是想修改部分区域的情况。 在WebUI中通常选择用涂抹重绘区域的方式来让AI知道要重绘哪里&#xff0c;这个被涂抹的区域会被AI识别为黑白区域&#xff0c;白色的部分也就是所谓的重绘蒙版“…

kali中安装zsteg教程

1、下载文件 git clone http://www.github.com/zed-0xff/zsteg 2、第一步需要保证虚拟机是有网络的&#xff0c;不然无法克隆 3、可以将网络设置成如下后重启&#xff0c;访问百度看看能不能访问&#xff0c;若可以访问&#xff0c;则进行下一步 4、查看源&#xff0c;删除源&…

WinForm之TCP服务端

目录 一 原型 二 源码 一 原型 二 源码 using System.Net; using System.Net.Sockets; using System.Text;namespace TCP网络服务端通讯 {public partial class Form1 : Form{public Form1(){InitializeComponent();}TcpListener listener null;TcpClient handler null;Ne…

未实施数据加密的企业,如何快速符合等保2.0标准?

企业若未实施数据加密&#xff0c;想要快速符合等保2.0标准&#xff0c;可以遵循以下步骤&#xff1a; 风险评估与规划&#xff1a; • 首先&#xff0c;进行全面的信息安全风险评估&#xff0c;识别数据处理的关键环节、敏感信息类型及其存储、传输路径。 • 基于评估结果&…

【SpringBoot + Vue 尚庭公寓实战】公寓杂费接口实现(八)

【SpringBoot Vue 尚庭公寓实战】公寓杂费接口实现&#xff08;八&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】公寓杂费接口实现&#xff08;八&#xff09;1、公寓杂费业务介绍2、公寓杂费逻辑模型介绍3、接口实现3.1、保存或更新杂费值3.2、保存或更新杂费名称3…

使用‘消除’技术绕过LLM的安全机制,不用训练就可以创建自己的nsfw模型

开源的大模型在理解和遵循指令方面都表现十分出色。但是这些模型都有审查的机制&#xff0c;在获得被认为是有害的输入的时候会拒绝执行指令&#xff0c;例如会返回“As an AI assistant, I cannot help you.”。这个安全功能对于防止误用至关重要&#xff0c;但它限制了模型的…

大数据同步方案怎么选,才能提高企业的业务效率?

大数据同步通常指的是在多个数据源或存储系统之间同步数据的过程&#xff0c;可以确保数据的一致性&#xff0c;提高数据的可用性和可靠性&#xff0c;同时支持数据分析和决策制定。 大数据同步的步骤通常包括&#xff1a; 数据识别&#xff1a;确定需要同步的数据类型和范围&…

《Brave New Words 》9.1 AI 世界中的就业

Part IX: Work and What Comes Next 第九部分&#xff1a;工作及其未来发展 The one who plants trees, knowing that he will never sit in their shade, has at least started to understand the meaning of life. —Rabindranath Tagore 种树的人&#xff0c;虽然知道他永远…

next.js开发中页面回退时报Unhandled Runtime ErrorTypeError destroy is not a function

Next.js开发中页面回退时报Unhandled Runtime Error:TypeError: destroy is not a function 问题描述 在Next.js开发中&#xff0c;从A页面跳转到B页面&#xff0c;再使用浏览器回退到A页面时报上述错误&#xff1a; 错误原因 是因为在B页面里&#xff0c;在使用useEffect时…

python接入汇率换算工具提高网站/小程序日活度

实时汇率换算工具可以帮助用户快速准确地计算不同货币之间最新的汇兑比例。无论是金融从业者或者是人们日常生活出行都会使用到&#xff0c;广泛用于国际结算、银行汇率查询应用、开展跨国贸易、投资等参考场景。 我们可以通过在网站或者小程序中接入这样一个小工具&#xff0…

HIGHLANDS - Stylized Environment(山林场景系统)

HIGHLANDS是一个游戏制作工具,包含制作游戏所需的一切。使用一系列模型创建自己的3D世界,使用着色器对其进行自定义,使用粒子效果使其栩栩如生,使用专为此软件包创建的132种声音使场景听起来栩栩如生。 该软件包已针对PC和游戏机进行了优化,尚未在移动和VR平台上进行测试。…

AI视频教程下载-用ChatGPT使Elementor创建高转化率的Clickbank漏斗

Elementor & ChatGPT_ Build Clickbank Bridge Funnel in 2Hours 在WordPress上进行联盟营销&#xff1a;使用Elementor创建高转化率的Clickbank漏斗&#xff1b;无需ClickFunnels&#xff0c;借助ChatGPT。 将您的联盟营销梦想变为现实——轻松且经济实惠&#xff01;解锁…