AJAX 请求通常使用 application/x-www-form-urlencodedapplication/json 作为内容类型(Content-Type)。

一、不同的编码方式会导致不同的转义行为

application/x-www-form-urlencoded

这是表单默认的编码方式,会将请求参数序列化为 URL 编码形式。

JSON 字符串中的某些字符可能会被 URL 编码转义,例如:

  • 空格变为 +
  • " 转为 %22
  • { 转为 %7B
  • } 转为 %7D

application/json

如果 Content-Typeapplication/json,数据以 JSON 格式发送,通常不会对 JSON 字符串本身做额外的转义。

二、不同的前端方法对参数的处理方式不同

jQuery

如果你使用的是 jQuery 的 $.ajax,默认会根据 Content-Type 对参数进行序列化处理:

$.ajax({
url: ‘/api’,
method: ‘POST’,
data: {
arrayParam: [
JSON.stringify({ key: “value1” }),
JSON.stringify({ key: “value2” })
]
}
});

 

  • 默认 Content-Type: application/x-www-form-urlencoded 时,JSON 字符串会被 URL 编码。
  • 如果手动指定 Content-Type: application/json,需要将数据序列化为 JSON,避免重复编码:

$.ajax({
url: ‘/api’,
method: ‘POST’,
contentType: ‘application/json’,
data: JSON.stringify({
arrayParam: [
JSON.stringify({ key: “value1” }),
JSON.stringify({ key: “value2” })
]
})
});

Fetch API

fetch 的默认行为是不会对请求体进行额外转义,只需要确保正确设置 Content-Type

fetch(‘/api’, {
method: ‘POST’,
headers: {
‘Content-Type’: ‘application/json’
},
body: JSON.stringify({
arrayParam: [
JSON.stringify({ key: “value1” }),
JSON.stringify({ key: “value2” })
]
})
});

三、后端接收时出现问题

尽管前端发送的 JSON 数据一般不会被多次转义,但某些后端配置或处理机制可能会对接收到的参数进行自动转义。例如:

  • PHP 的 magic_quotes_gpc(已弃用):会自动对输入进行转义。
  • HTML 表单嵌套 JSON:JSON 数据如果直接插入到 HTML 表单字段中传输,可能被浏览器自动转义。

 

作者 admin

百度广告效果展示