默认文件1620658909946.png

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

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

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

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

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

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

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

    1. const http = require('http');
    2. function sendRequest() {
    3. const req = http.request({
    4. method: 'GET',
    5. host: '127.0.0.1',
    6. port: 3010,
    7. path: '/api',
    8. headers: {
    9. Cookie: ['a=111', 'b=222'] // 方式一设置
    10. }
    11. }, res => {
    12. let data = '';
    13. res.on('data', chunk => data += chunk.toString());
    14. res.on('end', () => {
    15. console.log('response body: ', data);
    16. console.log('response cookie: ', res.headers['set-cookie']);
    17. });
    18. });
    19. req.setHeader('Cookie', ['b=222', 'c=333']) // 方式二设置
    20. req.on('error', console.error);
    21. req.end();
    22. }
    23. sendRequest();

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

    1. const http = require('http');
    2. http.createServer((req, res) => {
    3. if (req.url === '/api') {
    4. console.log('received cookie data: ', req.headers.cookie);
    5. res.setHeader('Set-Cookie', ['c=333', 'd=444'])
    6. res.end('Cookie set success!');
    7. } else {
    8. res.end('ok!');
    9. }
    10. }).listen(3010);

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