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);
});
相关推荐
Shingmc340 分钟前
【Linux】应用层协议HTTP
网络·网络协议·http
加号32 小时前
【C#】 HTTP 请求通讯实现指南
开发语言·http·c#
CDN3602 小时前
告别TCP队头阻塞!HTTP/3与QUIC协议在2026年的实战落地
网络协议·tcp/ip·http
深邃-3 小时前
【Web安全】-计算机网络协议(1):IP协议详解,HTTP协议介绍
linux·tcp/ip·计算机网络·安全·web安全·http·网络安全
庞轩px4 小时前
第三篇:SpringMVC——一个HTTP请求在Spring中经历了什么?
网络协议·spring·http·springmvc·handlermapping·前端控制器
静心观复20 小时前
从短连接到 gRPC:一文读懂 HTTP 连接模型的演进
网络·网络协议·http
花间相见1 天前
【全栈开发03】—— curl 常用参数详解与 HTTP 请求实战
网络·网络协议·http
天草二十六_简村人1 天前
对接AI大模型之nginx代理配置SSE接口
运维·网络·nginx·http·阿里云·ai·云计算
报错小能手1 天前
HTTP/2 牛逼在哪?
网络·网络协议·tcp/ip·http
6190083361 天前
spring中 HTTP 请求常见格式
java·spring·http