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');

  1. delete(name) - 删除指定头部

headers.delete('X-Custom-Header');

  1. get(name) - 获取指定头部的值

console.log('Content-Type:', headers.get('Content-Type')); // application/json

  1. has(name) - 检查是否存在指定头部

console.log('Has Authorization:', headers.has('Authorization')); // true

  1. set(name, value) - 设置头部值(会覆盖已有的值)

headers.set('Content-Type', 'application/xml'); console.log('New Content-Type:', headers.get('Content-Type')); // application/xml

  1. forEach(callback) - 遍历所有头部

headers.forEach(function(value, name) { console.log(name + ': ' + value); });

  1. entries() - 返回包含所有键值对的迭代器

for (var entry of headers.entries()) { console.log(entry[0] + ': ' + entry[1]); }

  1. keys() - 返回包含所有键的迭代器

for (var key of headers.keys()) { console.log('Header name:', key); }

  1. values() - 返回包含所有值的迭代器

for (var value of headers.values()) { console.log('Header value:', value); }

在 fetch 请求中使用 Headers 对象

javascript 复制代码
// 在 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);
});
相关推荐
tang&1 小时前
HTTP与HTTPS协议详解:从基础到加密原理
计算机网络·http·https
上海合宙LuatOS1 小时前
LuatOS扩展库API——【httpdns】使用HTTP进行域名解析
网络·物联网·网络协议·http·lua·luatos
思麟呀1 天前
数据链路层和物理层
网络·网络协议·http·智能路由器
福大大架构师每日一题1 天前
nginx 1.30.0稳定版深度解析:Early Hints、HTTP/2后端、MPTCP全量上线,1.29.x分支精华全面整合
运维·nginx·http
砍材农夫1 天前
spring-ai 第十二mcp server调用入门(http协议)
人工智能·spring·http
孙同学_2 天前
【项目篇】高并发服务器 - HTTP服务器组件拆解,从Util到HttpServer
运维·服务器·http
SilentSamsara2 天前
HTTP/1.1 到 HTTP/3:每代协议解决了什么问题
网络·网络协议·tcp/ip·http·https
SilentSamsara2 天前
TLS/HTTPS 实战:证书链、握手与生产配置
网络·数据库·网络协议·http·https
学代码的真由酱2 天前
HTTPS
网络协议·http·https
W.A委员会3 天前
常见网络攻击
网络·http·网络安全