• 【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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这个例子中,我们创建了一个按钮和一个用于显示数据的

    元素。当按钮被点击时,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);
    
    • 1
    • 2

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

    POST 请求

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

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

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在这个例子中,我们使用 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 = `

    Title: ${data.title}

    Body: ${data.body}

    `
    ; }) .catch(error => { // 处理请求失败的情况 console.error('请求失败:', error.message); }); }
    script> body> html>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这个例子中,我们使用了 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

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

    处理跨域请求

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

    JSONP

    JSONP 是一种跨域请求的方法,它利用了