【Java 进阶篇】Ajax 入门:打开前端异步交互的大门

在这里插入图片描述

欢迎来到前端异步交互的世界!在这篇博客中,我们将深入探讨 Ajax(Asynchronous JavaScript and XML),这是一项能够让你的网页在不刷新的情况下与服务器进行数据交互的技术。无论你是刚刚踏入前端开发的小白,还是有一定经验的开发者,相信通过本文的学习,你将对 Ajax 有更深入的理解。

踏入异步交互的大门

在开始之前,让我们先理解什么是 Ajax。Ajax 并不是一种新的编程语言,而是一种利用现有的技术来创建更好、更快以及更友好用户体验的技术。它的全称是 Asynchronous JavaScript and XML,即异步 JavaScript 和 XML。异步是 Ajax 的核心,它使得页面能够在后台与服务器进行数据交互,无需刷新整个页面。

在早期,Ajax 主要用于获取和发送 XML 格式的数据。然而,随着前端技术的发展,现在我们更常用 JSON(JavaScript Object Notation)格式来进行数据交互,因为 JSON 更轻量且易于处理。

Ajax 的基本原理

Ajax 的基本原理是通过 JavaScript 中的 XMLHttpRequest 对象来与服务器进行通信。这个对象允许浏览器向服务器发送请求并处理响应,而无需刷新整个页面。随着浏览器和前端技术的发展,现在我们更常用 fetch 函数来进行 Ajax 请求。

让我们通过一个简单的例子来了解 Ajax 的基本用法。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Ajax 入门</title>
</head>
<body><button id="loadDataButton">加载数据</button><div id="dataContainer"></div><script>document.getElementById('loadDataButton').addEventListener('click', loadData);function loadData() {// 创建一个 XMLHttpRequest 对象const xhr = new XMLHttpRequest();// 配置请求xhr.open('GET', 'https://jsonplaceholder.typicode.com/posts/1', true);// 注册回调函数,处理响应xhr.onload = function() {if (xhr.status === 200) {// 成功接收到数据,处理响应const data = JSON.parse(xhr.responseText);document.getElementById('dataContainer').innerText = data.title;} else {// 处理请求失败的情况console.error('请求失败:', xhr.statusText);}};// 发送请求xhr.send();}</script>
</body>
</html>

在这个例子中,我们创建了一个按钮和一个用于显示数据的 <div> 元素。当按钮被点击时,loadData 函数会被调用。在这个函数中,我们创建了一个 XMLHttpRequest 对象,配置了一个 GET 请求,并注册了一个回调函数 onload 来处理服务器的响应。最后,我们通过 send 方法发送请求。

这只是 Ajax 的一个基本用法,后面我们会介绍更多高级的用法和工具。

Ajax 请求的类型

Ajax 请求有多种类型,最常见的有两种:GET 和 POST。

GET 请求

GET 请求用于从服务器获取数据。在 Ajax 中,我们可以通过设置 XMLHttpRequest 对象的 open 方法的第一个参数为 'GET' 来发起 GET 请求。

// 示例代码
xhr.open('GET', 'https://api.example.com/data', true);

GET 请求通常用于获取数据,例如从服务器获取一篇文章、一个用户的信息等。

POST 请求

POST 请求用于向服务器发送数据。与 GET 请求不同,POST 请求通常需要在请求体中发送一些数据。在 Ajax 中,我们可以通过设置 XMLHttpRequest 对象的 open 方法的第一个参数为 'POST' 来发起 POST 请求。

// 示例代码
xhr.open('POST', 'https://api.example.com/submitData', true);

POST 请求通常用于提交表单数据、上传文件等操作。

使用 Fetch API 进行 Ajax 请求

fetch 是 ES6 中引入的一种现代化的发起网络请求的方法,它基于 Promise,使用fetch 可以更清晰地处理异步操作。让我们通过一个简单的例子来了解如何使用 fetch 进行 Ajax 请求。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>使用 Fetch 进行 Ajax 请求</title>
</head>
<body><button id="loadDataButton">加载数据</button><div id="dataContainer"></div><script>document.getElementById('loadDataButton').addEventListener('click', loadData);function loadData() {// 使用 Fetch API 发起 GET 请求fetch('https://jsonplaceholder.typicode.com/posts/1').then(response => {// 检查请求是否成功if (!response.ok) {throw new Error('请求失败:' + response.statusText);}// 将响应转换为 JSONreturn response.json();}).then(data => {// 成功接收到数据,处理响应document.getElementById('dataContainer').innerText = data.title;}).catch(error => {// 处理请求失败的情况console.error('请求失败:', error.message);});}</script>
</body>
</html>

在这个例子中,我们使用 fetch 发起了一个 GET 请求。fetch 返回一个 Promise,我们可以通过 then 方法处理成功的响应,通过 catch 方法处理请求失败的情况。这样的写法更加直观和清晰。

处理 JSON 数据

在前面的例子中,我们通过 JSON.parse 或者 response.json() 来处理从服务器返回的 JSON 数据。这是因为大多数情况下,我们与服务器交互的数据都是以 JSON 格式传输的。下面是一个使用 fetch 处理 JSON 数据的例子:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>处理 JSON 数据</title>
</head>
<body><button id="loadDataButton">加载数据</button><div id="dataContainer"></div><script>document.getElementById('loadDataButton').addEventListener('click', loadData);function loadData() {// 使用 Fetch API 发起 GET 请求fetch('https://jsonplaceholder.typicode.com/posts/1').then(response => {// 检查请求是否成功if (!response.ok) {throw new Error('请求失败:' + response.statusText);}// 将响应转换为 JSONreturn response.json();}).then(data => {// 成功接收到数据,处理响应const dataContainer = document.getElementById('dataContainer');dataContainer.innerHTML = `<p><strong>Title:</strong> ${data.title}</p><p><strong>Body:</strong> ${data.body}</p>`;}).catch(error => {// 处理请求失败的情况console.error('请求失败:', error.message);});}</script>
</body>
</html>

在这个例子中,我们使用了 data.titledata.body 属性来访问 JSON 数据中的字段,并将其展示在页面上。

发送 POST 请求

发送 POST 请求与 GET 请求类似,我们只需要在 fetch 的配置中指定请求的方法为 'POST',并在 body 中传递数据。下面是一个简单的例子:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>发送 POST 请求</title>
</head>
<body><button id="sendDataButton">发送数据</button><script>document.getElementById('sendDataButton').addEventListener('click', sendData);function sendData() {// 构建要发送的数据对象const dataToSend = {username: 'john_doe',email: 'john@example.com'};// 使用 Fetch API 发起 POST 请求fetch('https://jsonplaceholder.typicode.com/posts', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify(dataToSend)}).then(response => {// 检查请求是否成功if (!response.ok) {throw new Error('请求失败:' + response.statusText);}// 将响应转换为 JSONreturn response.json();}).then(data => {// 成功接收到数据,处理响应console.log('成功发送数据:', data);}).catch(error => {// 处理请求失败的情况console.error('请求失败:', error.message);});}</script>
</body>
</html>

在这个例子中,我们使用 method: 'POST' 来指定请求方法为 POST,并在 body 中通过 JSON.stringify 将数据转换为 JSON 格式。在实际应用中,你需要根据服务器的要求来构建正确的请求。

处理跨域请求

在进行 Ajax 请求时,可能会遇到跨域的问题。跨域是指在不同域名、不同端口或不同协议之间进行网络请求。为了解决这个问题,需要在服务器端进行一些配置,或者使用 JSONP(JSON with Padding)等方法。在本文中,我们主要介绍一些简单的跨域处理方法。

JSONP

JSONP 是一种跨域请求的方法,它利用了 <script> 标签不受同源策略限制的特点。具体来说,通过创建一个 <script> 标签,将请求的 URL 设置为带有回调函数的 URL,服务器会将数据包装在回调函数中返回。下面是一个 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><button id="loadDataButton">加载数据</button><div id="dataContainer"></div><script>document.getElementById('loadDataButton').addEventListener('click', loadData);function handleResponse(data) {// 处理响应数据document.getElementById('dataContainer').innerText = data.title;}function loadData() {// 创建一个 script 元素const script = document.createElement('script');// 设置 script 的 src 属性,包含回调函数script.src = 'https://jsonplaceholder.typicode.com/posts/1?callback=handleResponse';// 将 script 元素添加到页面中document.body.appendChild(script);}</script>
</body>
</html>

在这个例子中,我们创建了一个名为 handleResponse 的回调函数,然后通过创建一个 <script> 标签,将请求的 URL 设置为 'https://jsonplaceholder.typicode.com/posts/1?callback=handleResponse'。这样,服务器会返回一个包含数据的 JavaScript 脚本,并在执行时调用我们提供的回调函数。

请注意,JSONP 有一些安全性方面的问题,因为它执行从服务器返回的任意代码。在使用 JSONP 时,请确保你信任并控制了提供 JSONP 服务的服务器。

CORS

CORS(Cross-Origin Resource Sharing)是一种更为现代和安全的跨域解决方案。服务器需要在响应头中包含一些特定的字段,以允许其他域的请求。同时,前端需要在请求头中设置 Origin 字段,表示请求的来源。下面是一个使用 CORS 的例子:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CORS 跨域请求</title>
</head>
<body><button id="loadDataButton">加载数据</button><div id="dataContainer"></div><script>document.getElementById('loadDataButton').addEventListener('click', loadData);function loadData() {// 使用 Fetch API 发起跨域请求fetch('https://api.example.com/data', {method: 'GET',headers: {'Origin': 'https://yourwebsite.com' // 替换为实际的域名}}).then(response => {// 检查请求是否成功if (!response.ok) {throw new Error('请求失败:' + response.statusText);}// 将响应转换为 JSONreturn response.json();}).then(data => {// 成功接收到数据,处理响应document.getElementById('dataContainer').innerText = data.message;}).catch(error => {// 处理请求失败的情况console.error('请求失败:', error.message);});}</script>
</body>
</html>

在这个例子中,我们在请求头中设置了 Origin 字段,表示请求的来源。服务器在响应头中设置了 Access-Control-Allow-Origin 字段,表示允许来自特定域的请求。这样,浏览器就允许了跨域请求。

Ajax 进阶:使用 Axios 库

尽管使用原生的 Fetch API 可以完成绝大部分的网络请求,但在实际项目中,我们通常会使用一些第三方库来简化和增强我们的代码。其中,Axios 是一个流行的网络请求库,它提供了更丰富的功能和更友好的 API。

要使用 Axios,首先需要在项目中安装 Axios:

npm install axios

然后,我们可以使用如下的方式来进行 GET 和 POST 请求:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>使用 Axios 进行 Ajax 请求</title>
</head>
<body><button id="loadDataButton">加载数据</button><div id="dataContainer"></div><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script>document.getElementById('loadDataButton').addEventListener('click', loadData);function loadData() {// 使用 Axios 发起 GET 请求axios.get('https://jsonplaceholder.typicode.com/posts/1').then(response => {// 成功接收到数据,处理响应document.getElementById('dataContainer').innerText = response.data.title;}).catch(error => {// 处理请求失败的情况console.error('请求失败:', error.message);});}</script>
</body>
</html>

Axios 提供了更简洁的 API,同时还支持许多高级特性,比如拦截器、并发请求等。在实际项目中,Axios 是一个非常值得考虑的选择。

结语

通过本文的学习,你应该对 Ajax 的基本原理、GET 和 POST 请求、Fetch API、处理 JSON 数据、跨域请求以及使用 Axios 进行网络请求有了一定的了解。Ajax 是现代前端开发中不可或缺的一部分,掌握它将使你能够更高效地构建交互性强、用户体验良好的网页应用。

在实际项目中,记得合理处理异常情况,保证代码的可维护性和稳定性。同时,不断学习和实践,深入理解前端技术的方方面面,将使你在前端开发的路上走得更远。祝愿你在 Ajax 的世界中,探索出属于自己的精彩!

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

4 redis的HyperLogLog入门原理

一、HyperLogLog&#xff08;字符串类型&#xff09; 需求&#xff1a;大型网站(不在大厂基本上用不到) 每个网页每天的 UV 数据(独立访客)&#xff0c;统计如何实现&#xff1f;(尽量少的占用存储空间) Redis 提供了 HyperLogLog 数据结构就是用来解决这种统计问题的。Hyper…

学习网络编程No.10【深入学习HTTPS】

引言&#xff1a; 北京时间&#xff1a;2023/11/14/18:45&#xff0c;因为种种原因&#xff0c;上个月的文章昨天才更新&#xff0c;目前处于刷题前夕&#xff0c;算法课在看了。这次和以前不一样&#xff0c;因为以前对知识框架没有很好的理念&#xff0c;并不清楚相关知识要…

Vite - 静态资源处理 - json文件导入

直接就说明白了 vite 中对json 文件直接当作一个模块来解析。 可以直接导入使用&#xff01; 可以直接导入使用&#xff01; 可以直接导入使用&#xff01;json文件中的key&#xff0c;直接被作为一个属性&#xff0c;可以单独被导入。 因此&#xff0c;导入json文件有两种方式…

2024年csdn最新最全的Postman接口测试: postman实现参数化

什么时候会用到参数化 比如&#xff1a;一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块&#xff1a;正确的用户名&#xff0c;密码 成功&#xff1b;错误的用户名&#xff0c;正确的密码 失败 postman实现参数化 在实际的接口测试中&#xff0c;部分参数…

SpringSecurity6 | 默认登录页

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

【LeetCode刷题-树】--1367.二叉树中的链表

1367.二叉树中的链表 方法&#xff1a;枚举 枚举二叉树中的每个节点为起点往下的路径是否与链表相匹配的路径&#xff0c;为了判断是否匹配设计了一个递归函数dfs(root,head),其中root表示当前匹配到的二叉树节点&#xff0c;head表示当前匹配到的链表节点&#xff0c;整个函数…

第7天:信息打点-资产泄漏amp;CMS识别amp;Git监控amp;SVNamp;DS_Storeamp;备份

第7天&#xff1a;信息打点-资产泄漏&CMS识别&Git监控&SVN&DS_Store&备份 知识点&#xff1a; 一、cms指纹识别获取方式 网上开源的程序&#xff0c;得到名字就可以搜索直接获取到源码。 cms在线识别&#xff1a; CMS识别&#xff1a;https://www.yun…

【机器学习】划分训练集和测试集的方法

在机器学习中&#xff0c;我们的模型建立完成后&#xff0c;通常要根据评估指标来对模型进行评估&#xff0c;以此来判断模型的可用性。而评估指标主要的目的是让模型在未知数据上的预测能力最好。因此&#xff0c;我们在模型训练之前&#xff0c;要对训练集和测试集进行划分。…

每天一道算法题(六)——返回一组数字中所有和为 0 且不重复的三元组

文章目录 前言1、问题2、示例3、解决方法4、效果5、注意点 前言 注意&#xff1a;答案中不可以包含重复的三元组。 1、问题 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] n…

Transformer中位置嵌入的几种形式对比

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

git rebase 和 git merge的区别?以及你对它们的理解?

文章目录 前言是什么分析区别后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;git操作相关 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#xff0c;感谢…

【开发流程】持续集成、持续交付、持续部署

一、开发工作流程 假设把开发流程分为以下几个阶段&#xff1a; 编码 -> 构建 -> 集成 -> 测试 -> 交付 -> 部署 如上图所示&#xff0c;持续集成、持续交付、持续部署有着不同的软件自动交付周期。 二、持续集成、持续交付、持续部署 1、持续集成 持续集成…