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);
});
相关推荐
安生生申10 小时前
HTTP与HTTPS的区别
网络协议·http·https
一只小鱼儿吖10 小时前
携趣HTTP代理浏览器设置器(PC版)使用指南
网络·网络协议·http
kylezhao201913 小时前
C# 写一个Http 服务器和客户端
服务器·http·c#
羑悻的小杀马特14 小时前
【Linux篇章】穿越网络迷雾:揭开 HTTP 应用层协议的终极奥秘!从请求响应到实战编程,从静态网页到动态交互,一文带你全面吃透并征服 HTTP 协议,打造属于你的 Web 通信利刃!
linux·运维·网络·http·操作系统·网络通信
源远流长jerry15 小时前
TCP 与 TLS 层面 HTTP/1 升级到 HTTP/2
网络协议·tcp/ip·http
三两肉15 小时前
从明文到加密:HTTP与HTTPS核心知识全解析
网络协议·http·https
泡泡以安2 天前
【爬虫教程】第1章:现代HTTP协议栈深度解析
网络·网络协议·http
我先去打把游戏先2 天前
TCP、TLS、HTTP、HTTPS、MQTT、MQTTS几种网络协议的对比与解释
嵌入式硬件·mcu·物联网·网络协议·tcp/ip·http·aws
无序的浪2 天前
HTTPS加密及工作过程
网络协议·http·https
shughui2 天前
OSI 七层 / TCP/IP 四层模型详解 + HTTP 与 WebSocket 接口分类:从协议本质 到 设计规范
websocket·网络协议·tcp/ip·http·设计规范