【JS】获取 Headers 头部信息

当使用fetch请求接口时,响应头信息res.headers存储在Headers对象中,需要通过get方法按不区分大小写的规则获取。例如,获取Content-Length需使用res.headers.get(Content-Length)。此外,介绍了Headers对象的append、get、set、has和delete等方法,用于操作HTTP头信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、应用场景

  • 当我们请求一个接口的时候,会发现 res 里面包含一个 headers 响应头信息:
fetch(url, {
   method: 'GET',
   headers: {
     'content-type': 'application/json',
     'X-Requested-With': 'XMLHttpRequest',
   },
   mode: 'cors',
   credentials: 'include',
 }).then(res => {
   console.log('res =', res);
 });

在这里插入图片描述

  • 首先他里面肯定是有值的,只不过是一个Headers 对象,直接提供对象点语法是取不出来的

在这里插入图片描述

fetch(url, {
   method: 'GET',
   headers: {
     'content-type': 'application/json',
     'X-Requested-With': 'XMLHttpRequest',
   },
   mode: 'cors',
   credentials: 'include',
 }).then(res => {
   console.log('res =', res.headers.Date);	// undefined
   console.log('res =', res.headers.date);	// undefined
 });

这时候就要用到 Headers 对象 自带的方法了

fetch(url, {
   method: 'GET',
   headers: {
     'content-type': 'application/json',
     'X-Requested-With': 'XMLHttpRequest',
   },
   mode: 'cors',
   credentials: 'include',
 }).then(res => {
   console.log('res =', res.headers.get('Content-Length'));	// 1590
   console.log('res =', res.headers.get('content-length'));	// 1590
   // 不区分大小写
   console.log('res =', res.headers.get('conTEnt-length'));	// 1590
 });

二、实例方法

  • 创建一个空的 Headers 对象是简单的:
var myHeaders = new Headers();

2.1、追加:append()

  • append() 方法:可以追加一个新值到已存在的 headers 上,或者新增一个原本不存在的 header。
  • 语法:
`参数:
	name: 要追加给 Headers 对象的 HTTP header 名称。
	value: 要追加给 Headers 对象的 HTTP header 值。
`
myHeaders.append(name,value);
  • 示例:
var myHeaders = new Headers(); 
myHeaders.append('Content-Type', 'image/jpeg');
myHeaders.get('Content-Type'); // Returns 'image/jpeg'

// 如果指定 header 不存在,append()将会添加这个 header 并赋值 .
myHeaders.append('Accept-Encoding', 'deflate');
// 如果指定 header 已存在并允许有多个值,append()将会把指定值添加到值队列的末尾。
myHeaders.append('Accept-Encoding', 'gzip');
myHeaders.getAll('Accept-Encoding'); // Returns [ "deflate", "gzip" ]
  • 要使用新值覆盖旧值,请使用Headers.set。

2.2、获取:get()

  • get() 方法:以 ByteString 形式从 Headers 对象中返回指定 header 的全部值。如果 Header 对象中不存在请求的 header,则返回 null。
  • 语法:
`参数:
	name: 要获取 Headers 对象的 HTTP header 名称。
`
myHeaders.get(name);
  • 示例:
var myHeaders = new Headers(); 
myHeaders.append('Content-Type', 'image/jpeg');
myHeaders.get('Content-Type'); // 'image/jpeg'

// 如果存在多个 header 值,那么只有第一个值会被返回:
myHeaders.append('Accept-Encoding', 'deflate');
myHeaders.append('Accept-Encoding', 'gzip');
myHeaders.get('Accept-Encoding'); // "deflate,gzip"

2.3、覆盖:set()

  • set() 方法:在可以在已经声明中的 headers 对象修改已有的一组键值对或者创建一个新的键值对。
  • 语法:
`参数:
	name: 需要对 HTTP header 设置新值的 key,一般为字符串。
		  如果设置的name 不是 HTTP header 规范里面规定的 name,那么将会抛出错误"TypeError"。
	value: value 就是 name 对应的值.
`
myHeaders.set(name);
  • 示例:
var myHeaders = new Headers(); 
myHeaders.append('Content-Type', 'image/jpeg');
myHeaders.set('Content-Type', 'text/html');		// 'text/html'

// 如果这个键值对不存在,那么 set() 方法首先创建一个键值对,然后给它赋值。
myHeaders.set('Accept-Encoding', 'deflate');
// 如果这个键值对存在,那么 set() 方法将会覆盖之前的 value 值:
myHeaders.set('Accept-Encoding', 'gzip');
myHeaders.get('Accept-Encoding'); // 'gzip'
  • 如果你需要增加一个键值对,而不是要覆盖之前的键值对,那么你需要用append()方法

2.4、判断:has()

  • has()方法:返回一个布尔值来声明一个 Headers对象 是否包含特定的头信息。
  • 语法:
`参数:
	name: 你要测试的 HTTP 头字段的名称。
		  如果给出的名称不在 HTTP 头中,将爬出异常TypeError。
`
myHeaders.has(name);
  • 示例:
var myHeaders = new Headers(); 

myHeaders.append('Content-Type', 'image/jpeg');
myHeaders.has('Content-Type'); // true
myHeaders.has('Accept-Encoding'); // false

2.5、判断:delete()

  • delete()方法:可以从 Headers 对象中删除指定 header.
  • 语法:
`参数:
	name: 需删除的 HTTP header 名称。
`
myHeaders.delete(name);
  • 示例:
var myHeaders = new Headers(); 

// 先添加
myHeaders.append('Content-Type', 'image/jpeg');
myHeaders.get('Content-Type'); // 'image/jpeg'
// 后删除
myHeaders.delete('Content-Type');
myHeaders.get('Content-Type'); // null(因为它已被删除)

2.6、遍历:key(),values(),entries()

返回的是一个Headers Iterator {}迭代器,不能使用普通的for、forEach、map方法去遍历

// 创建一个 Headers 对象
var myHeaders = new Headers();
myHeaders.append('Content-Type', 'text/xml');
myHeaders.append('Vary', 'Accept-Language');

// 显示 Headers 中所有的 key
for(var key of myHeaders.keys()) {
   console.log(key);
   /*
   		打印结果:
   		'Content-Type'
   		'Vary'
   */
}

// 显示 Headers 中所有的 value
for(var value of myHeaders.values()) {
   console.log(value);
   /*
   		打印结果:
   		'text/xml'
   		'Accept-Language'
   */
}

// 显示 Headers 中所有的 [key, value] 键值对
for(var entrie of myHeaders.entries()) {
   console.log(entrie);
   /*
   		打印结果:
   		['Content-Type', 'text/xml']
   		['Vary', 'Accept-Language']
   */
}
Axios是一个流行的基于Promise的HTTP库,用于浏览器和Node.js中。如果你发现axios请求返回的数据中缺少预期的响应头headers),可能是以下几个原因造成的: 1. **默认配置**:Axios发送请求时不自动包括`withCredentials`属性,这可能导致跨域请求时某些头部信息不会被传递。你可以通过设置`config.withCredentials = true`来启用跨源资源共享。 2. **CORS限制**:如果目标服务器设置了CORS策略,只允许特定来源访问,那么某些头部可能不会返回给前端。检查服务器端的CORS设置,确保它们允许你的请求。 3. **错误处理**:确保你在处理响应时正确地捕获了错误。有时候,请求可能失败,导致headers不在响应对象上。你需要添加错误处理器来检查并处理这种情况。 4. **axios实例配置**:如果你使用的是自定义的axios实例,可能需要显式地设置`responseType`(如`json`、`text`等)才能接收headers,因为默认它可能只是数据体。 5. **状态码问题**:只有当请求成功(状态码2xx)时,headers才会包含在响应中。检查你的请求是否成功,如果不是,headers将不可用。 要解决这个问题,可以尝试以下步骤: ```javascript // 示例配置 axios.get('your_url', { headers: { 'Authorization': 'Bearer your-token' }, // 添加请求头 withCredentials: true, // 如果跨域的话 }).then(response => { console.log(response.headers); // 输出响应头 }) .catch(error => { if (error.response) { console.error(`Error status code: ${error.response.status}`); } else { console.error(`Error message: ${error.message}`); } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗不甘坠落的流星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值