核心是请求头content-type必须与实际发送数据格式严格一致:json需设application/json并手动序列化;表单键值对用application/x-www-form-urlencoded;文件上传用formdata且不设content-type,由浏览器自动生成boundary。

JavaScript 中 Ajax 处理 Content-Type 的核心,是让请求头里的 Content-Type 与你实际发送的数据格式完全一致。设错或漏设,后端很可能收不到、解析不了,甚至直接返回 400 或 415 错误。
原生 XMLHttpRequest:手动控制最灵活
用 XMLHttpRequest 时,必须在 open() 之后、send() 之前调用 setRequestHeader():
- 发 JSON 数据:先
xhr.setRequestHeader('Content-Type', 'application/json'),再xhr.send(JSON.stringify(data)) - 发表单键值对(如
name=张三&age=25):设为'application/x-www-form-urlencoded; charset=UTF-8',数据要 URL 编码 - 上传文件用
FormData:不要手动设 Content-Type —— 浏览器会自动生成带boundary的multipart/form-data,强行设置反而导致后端无法解析
fetch API:声明式配置更简洁
fetch 把请求头统一放在 headers 对象里,写法直观:
- JSON 请求:
headers: { 'Content-Type': 'application/json' },且body必须是字符串(JSON.stringify(obj)) - FormData 请求:
body: new FormData(formEl),headers里不写 Content-Type,留空或删掉这一项 - 带认证或其他自定义头(如
Authorization)可一并写进headers,无需额外步骤
jQuery $.ajax:靠配置项自动适配
jQuery 封装了常见场景,关键看 contentType 和 processData 怎么配:
- 默认行为(不设
contentType):自动设为application/x-www-form-urlencoded,并把 JS 对象转成key=val&key2=val2格式(processData: true) - 发 JSON:设
contentType: 'application/json'+processData: false,自己用JSON.stringify()处理data - 传文件或混合数据:设
processData: false+contentType: false,让浏览器处理FormData的边界和头信息
后端接收要注意什么
前端设的 Content-Type,决定了后端该用哪种方式读取请求体:
-
application/json→ 通常读原始输入流(如 Node.js 的req.body需 body-parser 中间件;Java Spring 用@RequestBody) -
application/x-www-form-urlencoded→ 直接取表单参数(PHP 的$_POST,Java 的request.getParameter()) -
multipart/form-data→ 必须用专门的文件解析器(如 Express 的multer,Spring 的MultipartFile)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











