Node.js知識 — HTTP 請求與響應(yīng)如何設(shè)置 Cookie 信息
HTTP Cookie[1] 是服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù),瀏覽器下次向同一服務(wù)器發(fā)起請求時會攜帶該 cookie 信息到服務(wù)器。
本文來自 “Nodejs技術(shù)棧” 一位讀者的一個問題,“Node.js 發(fā)起 HTTP 請求時,怎么攜帶上 cookie 信息?”
通常我們在瀏覽器向服務(wù)器發(fā)起一個請求,瀏覽器會檢查是否有相應(yīng)的 Cookie(瀏覽器的安裝目錄下有個 cookie 文件夾用來存放各個域下設(shè)置的 cookie 信息),如有則自動添加到 Request headers 的 cookie 字段中發(fā)送到服務(wù)器。
這是瀏覽器的行為會自動幫我們做,那么如果一個 Node.js 做為客戶端呢?
根據(jù) RFC 6265[2] 定義的 cookie 工作方式,在 HTTP 請求處理中,服務(wù)端可以在 Response headers 中為客戶端設(shè)置 Set-Cookie 字段。另外,客戶端在 HTTP 請求的 Request headers 中以字段 Cookie 的形式將 cookie 信息傳遞給服務(wù)端。
下面我們用 Node.js 提供的系統(tǒng)模塊 HTTP[3] 看看如何實現(xiàn)。
這是客戶端的請求方法實現(xiàn),我們可以在 headers 中直接設(shè)置 Cookie 字段,也可通過 http.request 返回的 req 對象調(diào)用 setHeader() 方法設(shè)置。
- 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'] // 方式一設(shè)置
- }
- }, 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']) // 方式二設(shè)置
- req.on('error', console.error);
- req.end();
- }
- sendRequest();
服務(wù)端代碼如下所示,注意響應(yīng)設(shè)置的是 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
本文轉(zhuǎn)載自微信公眾號「Nodejs技術(shù)?!梗梢酝ㄟ^以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Nodejs技術(shù)棧公眾號。