【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);
                    }
                    // 将响应转换为 JSON
                    return 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);
                    }
                    // 将响应转换为 JSON
                    return 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);
                }
                // 将响应转换为 JSON
                return 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);
                }
                // 将响应转换为 JSON
                return 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PMCW体制雷达系列文章(4) – PMCW雷达之抗干扰

说明 本文作为PMCW体制雷达系列文章之一&#xff0c;主要聊聊FMCW&PMCW两种体制雷达的干扰问题。事实上不管是通信领域还是雷达领域&#xff0c;对于一切以电磁波作为媒介的信息传递活动&#xff0c;干扰是无处不在的。近年来&#xff0c;随着雷达装车率的提高&#xff0c;…

Python---练习:封装一个函数,用于生成指定长度的验证码

练习涉及相关链接&#xff1a;Python---练习&#xff1a;编写一段Python代码&#xff0c;生成一个随机的4位验证码-CSDN博客 Python----函数中的说明文档-CSDN博客Python---return返回值-CSDN博客 代码&#xff1a; # 定义一个generate_code()函数 def generate_code(num): …

SDUT OJ《算法分析与设计》搜索算法

A - 子集和问题 Description 子集和问题的一个实例为〈S,t〉。其中&#xff0c;S{ x1 &#xff0c; x2 &#xff0c;…&#xff0c;xn }是一个正整数的集合&#xff0c;c是一个正整数。子集和问题判定是否存在S的一个子集S1&#xff0c;使得&#xff1a; 。 试设计一个解子…

【Web】Ctfshow SSTI刷题记录1

目录 ①web361 362-无过滤 ②web363-过滤单双引号 ③web364-过滤单双引号和args ④web365-过滤中括号[]、单双引号、args ⑤web366-过滤单双引号、args、中括号[]、下划线 ⑦web367-过滤单双引号、args、中括号[]、下划线、os ⑧web368-过滤单双引号、args、中括号[]、下…

【嵌入式 – GD32开发实战指南(ARM版本)】第2部分 外设篇 - 第3章 温度传感器DS18B20

1 理论分析 1.1 DS18B20概述 DS18B20 是 DALLAS 最新单线数字温度传感器,新的"一线器件"体积更小、适用电压更宽、更经济。Dallas 半导体公司的数字化温度传感器 DS1820 是世界上第一片支持 "一线总线"接口的温度传感器。 DS18B20采用的单总线协议,也…

Centos7 重置 Root 密码

Centos7 重置 Root 密码 1.启动服务器2.编辑启动项3.修改密码4.重新登陆 1.启动服务器 启动服务器后&#xff0c;不要直接进入系统&#xff0c;在开机页面按键盘【E】 2.编辑启动项 按【E】后进入如下页面&#xff0c;并按向下箭头&#xff0c;找到如图位置&#xff0c;添加如…

数据结构:红黑树的插入实现(C++)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 一、红黑树二、红黑树的插入三、代码实现总结 一、红黑树 红黑树的概念&#xff1a; 红黑树是一颗二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&…

慢日志查询

概述 MySQL的慢查询日志是MySQL提供的一种日志记录&#xff0c;它用来记录在MySQL中响应时间超过阀值的语句&#xff0c;具体指运行时间超过 long_query_time 值的SQL&#xff0c;则会被记录到慢查询日志中&#xff0c;ong_query_time 的默认值为 10&#xff0c;意思是运行10S…

redis三种集群方式

redis有三种集群方式&#xff1a;主从复制&#xff0c;哨兵模式和集群。 1.主从复制 主从复制原理&#xff1a; 从服务器连接主服务器&#xff0c;发送SYNC命令&#xff1b; 主服务器接收到SYNC命名后&#xff0c;开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所…

python-opencv 培训课程笔记(2)

python-opencv 培训课程笔记&#xff08;2&#xff09; 1.图像格式转换 先看一下cvtColor函数的例子 #默认加载彩图 pathrD:\learn\photo\cv\cat.jpg# imread(path,way) #way0 灰度图。way1 彩图 #默认彩图 imgcv2.imread(path) img_dogcv2.imread(path_dog) #图片格式的转化…

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

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

FPGA设计时序约束八、others类约束之Set_Case_Analysis

目录 一、序言 二、Set Case Analysis 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考资料 一、序言 在Vivado的时序约束窗口中&#xff0c;存在一类特殊的约束&#xff0c;划分在others目录下&#xff0c;可用于设置忽略或修改默认的时序…

关于DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC的一些发现

任务在哪 这个是11g以后的自动收集统计信息的后台任务&#xff0c;10g之前是在dba_scheduler_jobs里查看 SQL> SELECT CLIENT_NAME ,STATUS ,MEAN_INCOMING_TASKS_7_DAYS,MEAN_INCOMING_TASKS_30_DAYS FROM DBA_AUTOTASK_CLIENT WHERE…

mac控制台命令小技巧

shigen日更文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 hello伙伴们&#xff0c;作为忠实的mac骨灰级别的粉丝&#xff0c;它真的给我带来了很多效率上的提升。那作为接…

算法通关村——数字中的统计、溢出、进制转换处理模板

数字与数学基础问题 1、数字统计 1.1、符号统计 LeetCode1822. 给定一个数组&#xff0c;求所有元素的乘积的符号&#xff0c;如果最终答案是负的返回-1&#xff0c;如果最终答案是正的返回1&#xff0c;如果答案是0返回0. 这题其实只用看数组中0和负数的个数就好了&#x…

SpirngBoot + Vue 前后端分离开发工具代码

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

股东入股可用的出资形式主要有哪些

股东入股&#xff0c;可用的出资形式主要包括货币以及实物、知识产权、土地使用权等可以用货币估价并可以依法转让的非货币财产。 第一&#xff0c;货币。设立公司必然需要一定数量的流动资金。以支付创建公司时的开支和启动公司运营。因此&#xff0c;股东可以用货币出资。 第…

Kafka性能测试初探

相信大家对Kafka不会陌生&#xff0c;但首先还是要简单介绍一下。 Kafka是一种高性能的分布式消息系统&#xff0c;由LinkedIn公司开发&#xff0c;用于处理海量的实时数据流。它采用了发布/订阅模式&#xff0c;可以将数据流分发到多个消费者端&#xff0c;同时提供了高可靠性…

uniapp 微信小程序登录 新手专用 引入即可

预览 第一步导入插件 在引入的页面的登录按钮下拷贝一下代码 <template><view class"content"><button type"primary" click"login">微信登录</button></view><TC-WXlogin :wxloginwxlogin /> </templ…

阿坤老师的独特瓷器(Java详解)

一、题目描述 示例&#xff1a; 输入&#xff1a; 5 3 4 5 6 2 5 3 7 6 5 输出&#xff1a; 3 二、题解 思路分析&#xff1a; 题目要求我们计算出“独特瓷器”的个数&#xff0c;而“独特瓷器”是指对于瓷器A&#xff0c;没有另一个瓷器B&#xff0c;直径和高度都大于A。则…