推荐用 fetch 实现,语法简洁、支持 promise、设置自定义请求头更直观;fetch 需手动设 content-type 和 credentials,xmlhttprequest 则需在 open 后、send 前用 setrequestheader 设置头。

可以用 fetch 或 XMLHttpRequest 实现,推荐用 fetch,语法简洁、支持 Promise,且设置自定义请求头更直观。
使用 fetch 发送带自定义请求头的 POST 请求
fetch 默认不会发送 Cookie(除非显式配置),也不会自动设置 Content-Type,所以需要手动指定请求头和请求体。
- 将
method设为'POST' - 在
headers中添加自定义字段,例如'Authorization'、'X-Request-ID'等 - 注意:如果后端期望 JSON 数据,需设置
'Content-Type': 'application/json',并用JSON.stringify()序列化请求体 - 如需携带 Cookie,加上
credentials: 'include'(或'same-origin')
示例:
fetch('/api/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer abc123',
'X-Client-Version': '2.1.0'
},
credentials: 'include',
body: JSON.stringify({ username: 'admin', password: '123' })
})
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error(err));
使用 XMLHttpRequest 手动设置请求头
XMLHttpRequest 更底层,适合需要精细控制(比如监听上传进度)的场景。注意:必须在 open() 之后、send() 之前调用 setRequestHeader()。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
open()初始化请求(此时不能设请求头) -
setRequestHeader()设置每个自定义头,可多次调用 - 若要发送 Cookie,需设置
withCredentials = true - 发送 JSON 时,同样要手动设置
Content-Type并序列化数据
示例:
const xhr = new XMLHttpRequest();
xhr.open('POST', '/api/upload');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('X-Trace-ID', 'xyz789');
xhr.withCredentials = true;
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status
<h3>常见注意事项</h3>
<p>有些自定义请求头会被浏览器自动过滤(如 <code>Cookie</code>、<code>Host</code>、<code>Content-Length</code>),这是 CORS 安全限制;只有“简单请求头”(如 <code>Accept</code>、<code>Content-Type</code>、<code>Authorization</code>)能直接发送,其他属于“CORS 预检请求”的范畴。</p>
- 若用了非简单请求头(如
X-Custom-Header),浏览器会先发一个OPTIONS预检请求,后端必须响应Access-Control-Allow-Headers才能通过 - 确保后端允许该请求头,例如返回:
Access-Control-Allow-Headers: X-Request-ID, Authorization -
Content-Type值为application/json、text/plain、application/x-www-form-urlencoded属于简单类型;multipart/form-data会触发预检
不推荐用 jQuery.ajax 的原因
jQuery 的 $.ajax 虽然写法简单,但已逐渐被现代项目弃用。它内部仍基于 XMLHttpRequest,对 Promise 支持不够原生,且引入额外依赖。除非维护旧项目,否则建议直接用 fetch 或封装一个轻量工具函数。
如果确实要用,关键点一样:在 headers 选项里传入对象,注意 contentType 和 data 格式匹配,必要时加 xhrFields: { withCredentials: true }。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










