ajax关键知识点之XMLHttpRequest请求头与响应头处理实践_ajax请求头
ajax关键知识点之XMLHttpRequest请求头与响应头处理实践
大家好!写作本文的初衷是希望能和各位一起学习进步,深入探讨Ajax开发中XMLHttpRequest(XHR)对象的请求头与响应头处理技巧,通过解析其设置与获取机制,帮助大家掌握前端与服务器间的细粒度通信控制方法。以下将总结核心知识点并进行通俗化讲解,助力大家构建更灵活、更可控的异步通信逻辑。
一、核心知识点总结
(一)请求头(Request Headers)
- 定义:伴随请求发送的额外元数据,用于告知服务器请求的细节(如数据格式、认证信息等)。
- 常用请求头:
Content-Type
:指定请求体的格式(如application/x-www-form-urlencoded
、application/json
)。Authorization
:携带认证令牌(如Bearer Token)。X-Requested-With
:标识异步请求(常见值为XMLHttpRequest
)。
- 设置方法:通过
setRequestHeader(label, value)
在open()
之后、send()
之前调用。xhr.open(\"POST\", \"/api/data\"); xhr.setRequestHeader(\"Content-Type\", \"application/json\"); xhr.send(JSON.stringify(data));
(二)响应头(Response Headers)
- 定义:服务器返回的元数据,包含响应的描述信息(如数据类型、缓存策略等)。
- 常用响应头:
Content-Type
:返回数据的格式(如text/html
、application/xml
)。Cache-Control
:缓存控制策略(如max-age=3600
)。Set-Cookie
:服务器设置Cookie。
- 获取方法:
getAllResponseHeaders()
:返回所有响应头的字符串(键值对格式)。getResponseHeader(label)
:返回指定标签的响应头值。
const allHeaders = xhr.getAllResponseHeaders(); const contentType = xhr.getResponseHeader(\"Content-Type\");
(三)典型应用场景
- 设置请求头编码:
- POST请求提交表单数据时,需设置
Content-Type: application/x-www-form-urlencoded
,确保服务器正确解析参数。
- POST请求提交表单数据时,需设置
- 跨域请求认证:
- 通过
Authorization
头传递JWT令牌,实现跨域请求的身份验证。
- 通过
- 解析响应数据类型:
- 根据
Content-Type
判断响应数据格式(如JSON或XML),选择对应的解析方式。
- 根据
(四)注意事项
- 顺序要求:请求头必须在调用
send()
之前设置,否则无效。 - 浏览器限制:部分请求头(如
Accept
、User-Agent
)由浏览器自动设置,开发者不可修改。 - 跨域限制:非简单请求(如自定义请求头)需通过CORS预检(OPTIONS请求),否则会被浏览器阻塞。
二、通俗化知识点讲解
(一)请求头:给请求“贴标签”的快递员
请求头就像给快递包裹贴的标签,告诉服务器如何处理这个包裹:
- 标签内容示例:
- 当你邮寄一个密封包裹(POST请求体)时,贴上“Content-Type: application/json”标签,告诉服务器“包裹里是JSON格式的数据”。
- 如果你需要登录后才能访问资源,贴上“Authorization: Bearer xxx”标签,证明你有访问权限。
- 贴标签的时机:必须在快递员(XHR)出发前(调用
send()
前)贴好标签,否则服务器可能无法正确识别包裹内容。
(二)响应头:服务器的“包裹详情单”
响应头是服务器随响应返回的包裹详情单,包含包裹的元信息:
- 详情单内容示例:
- “Content-Type: text/html”表示包裹里装的是HTML页面,可以直接显示在浏览器中。
- “Cache-Control: max-age=60”表示这个包裹的内容可以缓存60秒,下次相同请求可以直接从缓存获取,加快响应速度。
- 查看详情单:通过
getAllResponseHeaders()
获取整个详情单内容,或通过getResponseHeader(\"key\")
查询特定信息(如查看数据类型)。
(三)实战案例:级联下拉列表的请求头设置
在级联下拉列表场景中,选择国家后需异步获取对应城市:
- 发送POST请求:
xhr.open(\"POST\", \"/api/cities\"); xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\"); xhr.send(`countryId=${selectedId}`);
- 设置
Content-Type
头告知服务器请求体是表单编码数据。
- 设置
- 处理响应头:
xhr.onreadystatechange = () => { if (xhr.readyState === 4 && xhr.status === 200) { const contentType = xhr.getResponseHeader(\"Content-Type\"); if (contentType.includes(\"application/json\")) { const cities = JSON.parse(xhr.responseText); // 更新下拉列表 } } };
- 根据响应头的
Content-Type
判断是否为JSON数据,再进行解析。
- 根据响应头的
(四)常见坑点:跨域与请求头限制
- 跨域请求头阻塞:如果前端和服务器不在同一域名下,自定义请求头(如
Authorization
)会触发CORS预检请求,需服务器配置允许该头(如返回Access-Control-Allow-Headers: Authorization
)。 - 默认请求头不可修改:浏览器自动设置的请求头(如
Host
、Connection
)无法通过setRequestHeader
修改,尝试修改会被忽略。
三、重点归纳
- 头信息的必要性:请求头与响应头是前端与服务器沟通的“元语言”,正确设置和解析头信息是保证通信正常的关键。
- 顺序与时机:请求头必须在发送请求前设置,响应头需在请求完成(
readyState=4
)后获取。 - 兼容性处理:IE低版本需通过ActiveX创建XHR对象,但其请求头处理逻辑与现代浏览器一致,无需额外适配。
四、知识点表格总结
setRequestHeader
方法xhr.setRequestHeader(\"Content-Type\", \"application/json\");
send()
前调用getAllResponseHeaders
/getResponseHeader
javascript
const headers = xhr.getAllResponseHeaders();
const length = xhr.getResponseHeader(\"Content-Length\");
readyState===4
时调用Access-Control-Allow-Headers
Content-Type
、Authorization
等写作不易,希望以上内容能帮助大家深入理解XMLHttpRequest的请求头与响应头处理逻辑!如果觉得本文有用,欢迎关注我的博客,点赞并留下你的评论,让我们在前端与服务器的细节通信中共同进步,打造更健壮的Web应用!😊