Node.js 小知识 — HTTP 请求与响应如何设置 Cookie 信息

HTTP Cookie[1] 是服务器发送到用户浏览器并保存在本地的一小块数据,浏览器下次向同一服务器发起请求时会携带该 cookie 信息到服务器。

本文来自 “Nodejs技术栈” 一位读者的一个问题,“Node.js 发起 HTTP 请求时,怎么携带上 cookie 信息?

通常我们在浏览器向服务器发起一个请求,浏览器会检查是否有相应的 Cookie(浏览器的安装目录下有个 cookie 文件夹用来存放各个域下设置的 cookie 信息),如有则自动添加到 Request headers 的 cookie 字段中发送到服务器。

这是浏览器的行为会自动帮我们做,那么如果一个 Node.js 做为客户端呢?

根据 RFC 6265[2] 定义的 cookie 工作方式,在 HTTP 请求处理中,服务端可以在 Response headers 中为客户端设置 Set-Cookie 字段。另外,客户端在 HTTP 请求的 Request headers 中以字段 Cookie 的形式将 cookie 信息传递给服务端

下面我们用 Node.js 提供的系统模块 HTTP[3] 看看如何实现。

这是客户端的请求方法实现,我们可以在 headers 中直接设置 Cookie 字段,也可通过 http.request 返回的 req 对象调用 setHeader() 方法设置。

const http = require('http');
function sendRequest() {
  const req = http.request({
    method: 'GET',
    host: '127.0.0.1',
    port: 3010,
    path: '/api',
    headers: {
      Cookie: ['a=111', 'b=222'] // 方式一设置
    }
  }, res => {
    let data = '';
    res.on('data', chunk => data += chunk.toString());
    res.on('end', () => {
      console.log('response body: ', data);
      console.log('response cookie: ', res.headers['set-cookie']);
    });
  });
  req.setHeader('Cookie', ['b=222', 'c=333']) // 方式二设置
  req.on('error', console.error);
  req.end();
}
sendRequest();

服务端代码如下所示,注意响应设置的是 Set-Cookie 字段。

const http = require('http');

http.createServer((req, res) => {
  if (req.url === '/api') {
    console.log('received cookie data: ', req.headers.cookie);
    res.setHeader('Set-Cookie', ['c=333', 'd=444'])
    res.end('Cookie set success!');
  } else {
    res.end('ok!');
  }
}).listen(3010);

同样的当你使用 request、node-fetch 等这些 HTTP 的请求库,其使用是相通的。

参考资料

[1]

HTTP Cookie: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies

[2]

RFC 6265: https://tools.ietf.org/html/rfc6265

[3]

HTTP: https://nodejs.org/dist/latest-v14.x/docs/api/http.html

- 这是底线 -

敬请关注「Nodejs技术栈」微信公众号,获取优质文章,如需投稿可在后台留言与我取得联系。

往期精彩推荐

Farrow 介绍:类型友好的函数式风格 Node.js Web 服务框架

[知乎回答] 前端是否要学习 Node.js?

2021 年 Node.js 开发人员学习路线图

Node.js 小知识 — 如何实现线程睡眠?

Node.js 小知识 — 实现图片上传写入磁盘的接口

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值