1. 使用 encodeURIComponent() 编码数据
// 在发送前对数据进行编码
let data = {
name: "张三&李四",
content: "key=value&special=<tag>"
};
// 方法1:手动编码每个值
let encodedData = Object.keys(data).map(key =>
encodeURIComponent(key) + "=" + encodeURIComponent(data[key])
).join("&");
// 方法2:使用 FormData 自动处理
let formData = new FormData();
formData.append("name", data.name);
formData.append("content", data.content);
$.ajax({
url: 'your-url',
type: 'POST',
data: encodedData, // 或 formData
contentType: 'application/x-www-form-urlencoded',
processData: false, // 如果发送字符串,需要设为 false
success: function(response) {
console.log(response);
}
});
2. 使用 JSON.stringify() 发送 JSON 数据
// 服务器端也需要支持 JSON 解析
let data = {
name: "张三&李四",
content: "key=value&special=<tag>"
};
$.ajax({
url: 'your-url',
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function(response) {
console.log(response);
}
});
3. 使用 FormData 对象(推荐)
// FormData 会自动处理编码
let formData = new FormData();
formData.append('name', '张三&李四');
formData.append('content', 'key=value&special=<tag>');
formData.append('file', $('#fileInput')[0].files[0]); // 也支持文件上传
$.ajax({
url: 'your-url',
type: 'POST',
data: formData,
contentType: false, // 让浏览器自动设置
processData: false, // 不处理数据
success: function(response) {
console.log(response);
}
});
4. 原生 JavaScript 解决方案
// 使用 XMLHttpRequest
function postData(url, data) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// 编码数据
const encodedData = Object.keys(data)
.map(key => encodeURIComponent(key) + '=' + encodeURIComponent(data[key]))
.join('&');
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send(encodedData);
});
}
// 使用 fetch API(现代推荐)
async function postDataFetch(url, data) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams(data).toString()
// 或使用 JSON:body: JSON.stringify(data)
});
return response.json();
}
5. 服务器端处理(以 PHP 为例)
// PHP 接收端
header('Content-Type: application/json; charset=utf-8');
// 方法1:接收原始 POST 数据
$rawData = file_get_contents('php://input');
// 方法2:如果是 JSON
$data = json_decode($rawData, true);
// 方法3:如果是 form-urlencoded
parse_str($rawData, $postData);
// 方法4:自动处理(PHP 已内置)
$name = $_POST['name']; // 会自动解码
$content = $_POST['content'];
// 安全处理:防止 XSS
$name = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
6. 常见问题及解决方案
问题1:& 符号被截断
// 错误:name=张三&李四 会被解析为两个参数
// 正确:name=张三%26李四
const data = "name=" + encodeURIComponent("张三&李四");
问题2:+ 号被转为空格
// encodeURIComponent 不会转换 + 号
// 如果仍有问题,可以额外处理
const encoded = encodeURIComponent(str).replace(/%20/g, '+');
问题3:中文字符乱码
// 确保字符编码一致
$.ajax({
// ...
contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
});
7. 通用封装函数
function safeAjaxPost(url, data, options = {}) {
const defaults = {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
};
// 合并选项
const config = { ...defaults, ...options };
// 如果是对象且不是 FormData/Blob,则编码
if (data && typeof data === 'object' &&
!(data instanceof FormData) &&
!(data instanceof Blob)) {
if (config.headers['Content-Type']?.includes('application/json')) {
config.body = JSON.stringify(data);
} else if (config.headers['Content-Type']?.includes('x-www-form-urlencoded')) {
config.body = new URLSearchParams(data).toString();
}
}
return fetch(url, config);
}
最佳实践建议:
优先使用 FormData 或
JSON 格式
设置正确的 Content-Type
服务器端做好接收各种格式的准备
统一前后端编码(推荐 UTF-8)
对用户输入进行适当的过滤和转义
选择哪种方法取决于你的具体需求和服务器端的支持情况。FormData + JSON 的组合通常是最稳妥的解决方案。