node-fetch响应头操作指南:Headers类与Set-Cookie提取技巧

node-fetch响应头操作指南:Headers类与Set-Cookie提取技巧

【免费下载链接】node-fetch A light-weight module that brings the Fetch API to Node.js 【免费下载链接】node-fetch 项目地址: https://gitcode.com/gh_mirrors/nod/node-fetch

在Node.js中处理HTTP响应时,响应头(Response Headers)包含了关键的元数据信息,如内容类型、缓存策略和认证状态等。node-fetch作为实现Fetch API的轻量级库,提供了Headers类(src/headers.js)来简化响应头的管理。本文将详细介绍如何使用Headers类进行常见操作,并重点讲解多值头(如Set-Cookie)的提取技巧。

一、认识Headers类:基础结构与核心功能

Headers类继承自URLSearchParams,并针对HTTP头特性扩展了专用方法。其核心设计目标是提供符合Fetch API规范的头信息管理能力,同时兼容Node.js的HTTP模块特性。

1.1 主要API概览

方法名作用示例
get(name)获取指定头的合并值headers.get('Content-Type')
getAll(name)获取指定头的所有值headers.getAll('Set-Cookie')
has(name)检查头是否存在headers.has('Authorization')
keys()遍历所有头名称for (const key of headers.keys()) {}
raw()获取原始头键值对(node-fetch扩展方法)headers.raw()

源码解析:Headers类通过Proxy实现了对方法参数的校验和标准化,确保头名称自动转为小写且符合HTTP规范(src/headers.js#L108-L146)。

二、基础操作:从响应中提取头信息

使用node-fetch发起请求后,响应对象的headers属性即为Headers实例。以下是提取常见响应头的标准流程:

2.1 基本提取示例

import fetch from 'node-fetch';

async function getHeaders() {
  const response = await fetch('https://api.example.com/data');
  
  // 获取单个头(自动合并多值)
  const contentType = response.headers.get('Content-Type');
  console.log('Content-Type:', contentType);
  
  // 检查头是否存在
  if (response.headers.has('Cache-Control')) {
    console.log('缓存策略:', response.headers.get('Cache-Control'));
  }
  
  // 遍历所有头
  console.log('所有响应头:');
  response.headers.forEach((value, name) => {
    console.log(`${name}: ${value}`);
  });
}

getHeaders();

2.2 处理特殊头:Content-Encoding的自动规范化

Headers类对Content-Encoding头做了特殊处理,会自动将其值转为小写(src/headers.js#L165-L167):

// 假设响应头为: Content-Encoding: GZIP, Deflate
const encoding = response.headers.get('Content-Encoding');
console.log(encoding); // 输出: "gzip, deflate"(已自动小写)

三、高级技巧:Set-Cookie多值头的提取与解析

Set-Cookie是典型的多值响应头,服务器通过它可向客户端发送多个Cookie。由于浏览器通常会自动处理Cookie存储,而Node.js环境需要手动解析,因此正确提取其值至关重要。

3.1 提取原始Cookie数组

使用getAll()方法获取所有Cookie值:

const cookies = response.headers.getAll('Set-Cookie');
console.log('原始Cookie数组:', cookies);
// 输出示例: ["sessionId=abc123; Path=/; HttpOnly", "theme=dark; Max-Age=31536000"]

3.2 解析Cookie为对象

通过node-fetch的工具方法或第三方库(如cookie)解析Cookie字符串:

import { parse } from 'cookie';

// 解析单个Cookie
const firstCookie = parse(cookies[0]);
console.log('解析后的Cookie:', firstCookie);
// 输出: { sessionId: 'abc123', Path: '/', HttpOnly: true }

// 批量解析所有Cookie
const cookieMap = cookies.reduce((map, cookieStr) => {
  const parsed = parse(cookieStr);
  const name = Object.keys(parsed)[0]; // 获取Cookie名
  map[name] = parsed[name];
  return map;
}, {});

console.log('Cookie键值对:', cookieMap);
// 输出: { sessionId: 'abc123', theme: 'dark' }

注意:Set-Cookie的解析逻辑未包含在node-fetch核心代码中,需手动实现或引入专用库。项目测试用例中的test/headers.js提供了头操作的验证示例。

四、实战场景:构建带认证头的请求

除了解析响应头,Headers类也可用于构造请求头。以下是携带JWT令牌发起请求的示例:

async function fetchWithAuth() {
  const headers = new Headers();
  headers.append('Authorization', 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...');
  headers.append('Content-Type', 'application/json');
  
  const response = await fetch('https://api.example.com/protected', {
    method: 'POST',
    headers: headers,
    body: JSON.stringify({ data: 'test' })
  });
  
  return response.json();
}

源码参考:Headers类的append()方法会自动验证头名称和值的合法性(src/headers.js#L116-L117),确保符合HTTP规范。

五、常见问题与解决方案

5.1 头名称的大小写问题

HTTP头名称是大小写不敏感的,但Headers类会自动将所有名称转为小写存储。因此以下两种写法等效:

response.headers.get('content-type'); // 推荐(符合内部存储格式)
response.headers.get('Content-Type'); // 同样有效(会自动转为小写)

5.2 处理重复头

当服务器返回重复的响应头(如多个Link头),get()会将其值合并为逗号分隔的字符串,而getAll()会返回数组:

// 响应头: Link: </page1>; rel=prev, </page3>; rel=next
console.log(response.headers.get('Link')); // 合并为单个字符串
console.log(response.headers.getAll('Link')); // 返回数组形式

六、总结与扩展阅读

通过Headers类(src/headers.js),node-fetch提供了简洁而强大的响应头操作接口。核心要点包括:

  • 使用get()获取合并值,getAll()获取多值数组
  • Set-Cookie需通过getAll()提取后手动解析
  • 头名称自动小写化,避免大小写敏感问题

官方文档进一步扩展:

掌握这些技巧后,你可以更灵活地在Node.js环境中处理HTTP响应头,满足复杂业务场景的需求。

【免费下载链接】node-fetch A light-weight module that brings the Fetch API to Node.js 【免费下载链接】node-fetch 项目地址: https://gitcode.com/gh_mirrors/nod/node-fetch

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

抵扣说明:

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

余额充值