2010-04-11 148 views

回答

6

只需在響應標題中從Set-Cookie參數中獲取cookie,並將它們發送回未來請求。不應該很難。

+12

如果不難,也許你可以在答案中提供一個示例代碼片段? – 2016-04-28 05:00:56

27

簡答:沒有。並不是很好。

我實現了這個作爲npm的一部分,以便我可以從github下載tarball。下面是這是否代碼:https://github.com/isaacs/npm/blob/master/lib/utils/fetch.js#L96-100

var cookie = get(response.headers, "Set-Cookie") 
if (cookie) { 
    cookie = (cookie + "").split(";").shift() 
    set(opts.headers, "Cookie", cookie) 
} 

該文件的得到了很多具體的NPM-東西(日誌,設置等),但它應該告訴你的總體思路。基本上,我正在收集cookie,以便在重新定向時可以在下一個請求中發送它們。

我已經與Mikeal Rogers討論瞭如何將這種功能添加到他的「request」util中,並完全支持由文件系統支持的cookiejar,但它確實非常棘手。你必須跟蹤哪些域發送cookie,等等。

這可能永遠不會直接包含在節點中,因此。但留意用戶空間的發展。

編輯:現在,默認情況下在請求中支持。

4

如果你正在尋找做餅乾客戶端可以使用https://github.com/mikeal/request

M.

+1

我按照他們的文檔中描述的「jar:true」來嘗試它,但是不工作... – 2014-07-13 12:59:47

2

下面的代碼演示如何使用的cookie從服務器端,下面是從HTTP客戶端解析餅乾演示API服務器檢查Cookie哈希:

var express = require("express"), 
app  = express(), 
hbs = require('hbs'), 
mongoose = require('mongoose'), 
port = parseInt(process.env.PORT, 10) || 4568; 

app.configure(function() { 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(express.static(__dirname + '/public_api')); 
app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 
app.get('/api', function (req, res) { 
    var cookies = {}; 
    req.headers.cookie && req.headers.cookie.split(';').forEach(function(cookie) { 
     var parts = cookie.split('='); 
     cookies[ parts[ 0 ].trim() ] = (parts[ 1 ] || '').trim(); 
    }); 
    if (!cookies['testcookie']) { 
     console.log('First request'); 
     res.cookie('testcookie','testvaluecookie',{ maxAge: 900000, httpOnly: true }); 
     res.end('FirstRequest'); 
    } else { 
     console.log(cookies['testcookie']); 
     res.end(cookies['testcookie']); 
    } 
}); 

app.listen(port); 

在客戶端,只需進行正常的請求,上述服務器API,我使用的請求模塊,默認情況下它傳輸的cookie爲每個請求。

request(options, function(err, response, body) {  
    console.log(util.inspect(response.headers)); 
    res.render("index.html", {layout: false,user: { 
     username: req.session.user + body 
    }}); 
}); 
2

在這裏其他的答案提出不包括大量的特殊情況下的cookies

自制的解決方案,一個功能完整的解決方案,可以輕鬆突破,缺乏大量的標準功能,如作爲持久性。

由於mentioned by isaacsrequest模塊現在有真正的cookie支持。 They provide examples with cookies on their Github page。這些示例解釋瞭如何通過將"tough-cookie" cookie jar添加到您的請求來啓用Cookie支持。

注:餅乾罐包含並幫助您管理您的餅乾。

引述其Readme(截至2015年4月):

Cookies是默認情況下禁用(否則,他們將在 後續請求中使用)。要啓用cookie,請將jar設置爲true(或者在 默認值或選項中)並安裝tough-cookie

Cookie管理通過tough-cookie module提供。它是一個穩定的,功能完整的Cookie管理工具,實現"HTTP State Management Mechanism" - RFC 6265。它甚至提供了多種選項來堅持(存儲)cookies,使用cookie store