使用 JavaScript 和 AJAX 发送 JSON 数据:完整指南
在 Web 开发中,前端与后端的数据交互是核心环节,JSON(JavaScript Object Notation)因其轻量级、易读、与 JavaScript 原生兼容的特性,成为前后端数据交换的主流格式,而 AJAX(Asynchronous JavaScript and XML)技术则允许网页在不刷新页面的情况下与服务器异步通信,提升用户体验,本文将详细介绍如何使用 JavaScript 和 AJAX 发送 JSON 数据,包括核心步骤、代码示例及常见问题解决。
核心概念:JSON 与 AJAX 的协作关系
什么是 JSON?
JSON 是一种基于文本的数据格式,采用键值对(key-value pair)的结构,类似于 JavaScript 对象。
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["数学", "英语"]
}
JSON 的优势在于:
- 轻量级,比 XML 更节省传输带宽;
- 与 JavaScript 无需额外解析(可直接用
JSON.parse()和JSON.stringify()转换); - 支持多种数据类型(字符串、数字、布尔值、数组、对象、null)。
什么是 AJAX?
AJAX 不是一门新技术,而是组合了 JavaScript、XMLHttpRequest(或 Fetch API)、DOM 操作等技术,实现异步数据交互的方法,核心特点是“异步”——即发送请求后,无需等待服务器响应,可继续执行其他代码,待收到响应后再回调处理。
发送 JSON 数据的核心步骤
通过 AJAX 发送 JSON 数据,通常需要以下 4 个步骤:
准备 JSON 数据
将数据转换为 JSON 格式的字符串,注意:AJAX 发送数据时,需将 JavaScript 对象序列化为 JSON 字符串(使用 JSON.stringify())。
创建 AJAX 请求
使用 XMLHttpRequest 对象(传统方式)或 Fetch API(现代推荐)创建 HTTP 请求。
设置请求头(Headers)
明确告知服务器发送的数据是 JSON 格式,需设置 Content-Type 为 application/json。
发送请求并处理响应
将序列化后的 JSON 字符串作为请求体发送,并在回调函数中处理服务器返回的响应。
代码实现:两种主流 AJAX 方式
使用 XMLHttpRequest(传统方法)
XMLHttpRequest 是 AJAX 的基础 API,兼容所有浏览器,但代码稍显繁琐。
示例:POST 请求发送 JSON 数据
// 1. 准备 JavaScript 对象
const userData = {
name: "李四",
email: "lisi@example.com",
hobbies: ["阅读", "跑步"]
};
// 2. 创建 XMLHttpRequest 实例
const xhr = new XMLHttpRequest();
// 3. 配置请求:POST 方法,目标 URL,异步(true)
xhr.open("POST", "https://api.example.com/users", true);
// 4. 设置请求头:告诉服务器发送的是 JSON 数据
xhr.setRequestHeader("Content-Type", "application/json");
// 5. 监听请求状态变化
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) { // 4 表示请求完成
if (xhr.status === 200) { // 200 表示成功
console.log("服务器响应:", JSON.parse(xhr.responseText));
} else {
console.error("请求失败,状态码:", xhr.status);
}
}
};
// 6. 发送请求:将对象序列化为 JSON 字符串
xhr.send(JSON.stringify(userData));
关键参数说明:
xhr.readyState:请求状态(0-4),4 表示请求已完成;xhr.status:HTTP 状态码(200 成功,404 未找到,500 服务器错误等);JSON.stringify():将 JavaScript 对象转为 JSON 字符串(必填,否则服务器无法正确解析)。
使用 Fetch API(现代推荐)
Fetch API 是 ES6 引入的新标准,语法更简洁,基于 Promise,适合现代浏览器环境。
示例:POST 请求发送 JSON 数据
// 1. 准备 JavaScript 对象
const productData = {
id: "12345",
name: "无线耳机",
price: 299,
inStock: true
};
// 2. 使用 Fetch 发送请求
fetch("https://api.example.com/products", {
method: "POST", // 请求方法
headers: {
// 告诉服务器发送的是 JSON 数据
"Content-Type": "application/json",
// 可添加其他请求头,如认证令牌
// "Authorization": "Bearer your_token"
},
// 将对象序列化为 JSON 字符串作为请求体
body: JSON.stringify(productData)
})
.then(response => {
// 检查响应状态(注意:fetch 不会自动抛出 HTTP 错误,需手动判断)
if (!response.ok) {
throw new Error(`HTTP 错误!状态码: ${response.status}`);
}
// 解析响应数据(假设服务器返回 JSON)
return response.json();
})
.then(data => {
console.log("服务器响应:", data);
})
.catch(error => {
console.error("请求失败:", error);
});
关键参数说明:
fetch(url, options):第一个参数是 URL,第二个是配置对象(可选);method:HTTP 方法(GET、POST、PUT、DELETE 等);headers:请求头对象,Content-Type: application/json是发送 JSON 数据的关键;body:请求体,必须是字符串(JSON 数据需用JSON.stringify()转换);response.json():将响应体解析为 JSON 对象(适用于服务器返回 JSON 的情况)。
常见问题与解决方案
服务器无法解析 JSON 数据?
原因:未设置 Content-Type: application/json,或未用 JSON.stringify() 序列化数据。
解决:确保请求头包含 "Content-Type": "application/json",且发送前用 JSON.stringify() 转换对象。
出现跨域错误(CORS)?
原因:前端请求的域名与服务器域名不同,浏览器出于安全策略拦截请求。
解决:
- 后端需在响应头中添加允许跨域的字段,如:
Access-Control-Allow-Origin: * # 允许所有域名(开发环境) # 或指定域名 Access-Control-Allow-Origin: https://your-frontend.com
- 前端可通过代理(如 Nginx、Vite 代理)绕过跨域限制。
Fetch 如何处理 HTTP 错误状态?
原因:Fetch 的 Promise 在 HTTP 状态码为 4xx/5xx 时不会 reject,需手动判断。
解决:通过 response.ok(状态码 200-299)判断,失败时手动抛出错误(如上述示例)。
发送 GET 请求时如何传递 JSON 数据?
GET` 请求的数据通常通过 URL 查询参数传递,而非请求体,若需传递 JSON 对象,可手动拼接参数:
const params = { name: "王五", age: 30 };
const queryString = new URLSearchParams(params).toString();
fetch(`https://api.example.com/users?${queryString}`, {
method: "GET",
headers: {
"Content-Type": "application/json" // GET 请求可省略,但建议保持一致
}
});
通过 AJAX 发送 JSON 数据是前端开发的必备技能,无论是传统的 XMLHttpRequest 还是现代的 Fetch API,核心逻辑一致:序列化数据 → 设置请求头 → 发送请求 → 处理响应,开发者可根据项目需求选择合适的方式——Fetch API 因其简洁性和 Promise 支持更受推荐,而 XMLHttpRequest 在兼容性要求高的项目中仍有价值。
后,你将能够轻松实现前后端 JSON 数据交互,为构建动态、高效的 Web 应用打下坚实基础。



还没有评论,来说两句吧...