HTTP 头部 和 Headers 对象
声明:本文主要内容来自通义灵码。
HTTP 头部
每个HTTP请求和响应都会携带一些头部字段。
XHR 请求会发送的头部字段
* 1. Accept: 浏览器能够处理的内容类型
* 2. Accept-Charset: 浏览器能够显示的字符集
* 3. Accept-Encoding: 浏览器能够处理的压缩编码 * 4. Accept-Language: 浏览器当前设置的语言
* 5. Connection: 浏览器与服务器的连接类型
* 6. Content-Type: 请求体的 MIME 类型(对于 POST 请求)
* 7. Cookie: 当前域下的 cookie 信息(如果有的话) * 8. Host: 请求的主机名和端口号
* 9. Referer: 发送请求的页面 URI
* 10. User-Agent: 浏览器的用户代理字符串
* 11. Authorization: 用于 HTTP 认证的授权头部
* 12. If-Modified-Since: 只有在指定时间之后资源被修改过才获取资源
* 13. If-None-Match: 用于条件请求的实体标签
* 14. Origin: 发起请求的源(协议、域名、端口)
浏览器自动添加的头部字段
注意:某些头部字段是浏览器自动添加的,不能通过 setRequestHeader() 方法修改
如:
Accept-Charset,
Accept-Encoding,
Access-Control-Request-Headers,
Access-Control-Request-Method,
Connection,
Content-Length,
Cookie,
Date,
DNT,
Expect,
Host,
Keep-Alive,
Origin,
Referer,
TE,
Trailer,
Transfer-Encoding,
Upgrade,
User-Agent,
Via
自定义头部字段
如果需要发送额外的请求头部,可以使用setRequestHeaders()方法。
setRequestHeaders()接收两个参数:头部字段的名称和值。
为保证请求头部被发送,必须在XHR的open()之后,send()之前调用setRequestHeaders()方法。
Headers 对象
Headers 接口允许您对 HTTP 请求和响应头进行操作。
通过 Headers 构造函数可以创建一个新的 Headers 对象。
Headers 对象提供了许多方法来添加、删除和修改 HTTP 头部信息
Headers 对象的作用域和可用性
1. Headers 是全局对象,可以在任何地方创建和使用,不仅仅局限于 Fetch API
2. 它是 Fetch API 规范的一部分,但其实现独立于具体的网络请求方法
3. 可以在任何需要处理 HTTP 头部的场景中使用 Headers 对象
4. 浏览器环境中,Headers 构造函数是全局可用的(只要浏览器支持 Fetch API)
Headers 对象的用途不仅限于 fetch() 请求
1. 可以用于处理 XMLHttpRequest 的请求头
2. 可以用于解析和操作响应头
3. 可以作为通用的 HTTP 头部处理工具
4. 可以用于测试和模拟 HTTP 头部操作
创建一个新的 Headers 对象
var headers = new Headers();
// 添加头部信息
headers.append('Content-Type', 'application/json');
headers.append('Authorization', 'Bearer token123');
headers.append('X-Custom-Header', 'CustomValue');
// 也可以在创建时初始化头部
var initHeaders = new Headers({ 'Content-Type': 'text/plain', 'X-Initial-Header': 'InitialValue' });
Headers 对象与普通对象的区别
1. Headers 对象提供了专门的方法来操作头部
2. Headers 对象会自动处理同名多值的情况
3. Headers 对象会对头部名称进行标准化处理
4. Headers 对象是可迭代的
Headers 对象的方法
1. append(name, value) - 添加新的头部
headers.append('X-Additional-Header', 'AdditionalValue');
2. delete(name) - 删除指定头部
headers.delete('X-Custom-Header');
3. get(name) - 获取指定头部的值
console.log('Content-Type:', headers.get('Content-Type')); // application/json
4. has(name) - 检查是否存在指定头部
console.log('Has Authorization:', headers.has('Authorization')); // true
5. set(name, value) - 设置头部值(会覆盖已有的值)
headers.set('Content-Type', 'application/xml'); console.log('New Content-Type:', headers.get('Content-Type')); // application/xml
6. forEach(callback) - 遍历所有头部
headers.forEach(function(value, name) { console.log(name + ': ' + value); });
7. entries() - 返回包含所有键值对的迭代器
for (var entry of headers.entries()) { console.log(entry[0] + ': ' + entry[1]); }
8. keys() - 返回包含所有键的迭代器
for (var key of headers.keys()) { console.log('Header name:', key); }
9. values() - 返回包含所有值的迭代器
for (var value of headers.values()) { console.log('Header value:', value); }
在 fetch 请求中使用 Headers 对象
// 在 fetch 请求中使用 Headers 对象
fetch("https://jsonplaceholder.typicode.com/posts", {method: "POST",headers: new Headers({'Content-Type': 'application/json','X-Requested-With': 'XMLHttpRequest'}),body: JSON.stringify({title: '使用 Headers 对象',body: '这是使用 new Headers() 创建的头部信息',userId: 1})
})
.then(function(response) {console.log('Response headers:');// 遍历响应头部for (var pair of response.headers.entries()) {console.log(pair[0] + ': ' + pair[1]);}return response.json();
})
.then(function(data) {console.log('使用 Headers 的请求结果:', data);
})
.catch(function(error) {console.error('请求错误:', error);
});// 普通对象方式(会被自动转换为 Headers 对象)
fetch("https://jsonplaceholder.typicode.com/posts/1", {headers: {'X-API-Key': 'abcdef12345','Accept': 'application/json'}
})
.then(function(response) {return response.json();
})
.then(function(data) {console.log('使用普通对象设置头部:', data);
});