NodeJS和HTTP客户端 – 是否支持Cookie?

NodeJS是一个很棒的工具,而且速度非常快。

我想知道HTTPClient是否支持cookie ,如果可以用来模拟非常基本的浏览器行为


帮助将非常感激! =)


编辑:

发现这个: node-httpclient (似乎有用!) 不工作!

只需从响应头中的Set-Cookie参数中获取cookie,然后将它们发回给未来的请求。 不应该很难。

简短的回答:不。 这不是很好。

我把它作为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,以便在redirect时可以在下一个请求中发回给他们。

我曾经与Mikeal Rogers讨论过将这种function添加到他的“request”util中,完全支持一个由文件系统支持的cookiejar,但这真的很棘手。 你必须跟踪哪些域发送cookie,等等。

这可能永远不会直接包含在节点中,因此。 但留意用户空间的发展。

编辑:这现在默认支持请求。

如果你正在寻找cookie客户端,你可以使用https://github.com/mikeal/request

M.

下面的代码演示了如何在服务器端使用cookie,下面是一个演示API服务器,它parsing来自http客户端的cookie,并检查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 }}); }); 

Zombie.js是另一种select,如果你想浏览器般的行为。 它“维护状态跨请求:历史,cookies,HTML5本地和会话记忆等”。 僵尸的cookie的更多信息api:http: //zombie.labnotes.org/API

还有PhantomJS和PhantomJS框架 ,比如CasperJS 。

一个function完整的cookie解决scheme

其他答案中提出的自制解决scheme并不包含很多特殊情况,很容易破解,缺乏很多标准特性,如持久性。

正如isaacs所提到的 , 请求模块现在具有真正的cookie支持。 他们在他们的Github页面上提供了Cookie的例子 。 这些示例解释了如何通过向您的请求中添加“韧体cookie”cookie jar来启用cookie支持。

注意:一个cookiesjar子包含并且帮助您pipe理您的cookies。

引用自述文件 (截至2015年4月):

Cookie默认是禁用的(否则,它们将在随后的请求中使用)。 要启用cookie,请将jar设置为true (默认或选项)并安装tough-cookie 。

Cookiepipe理是通过艰难的cookie模块提供的 。 这是一个稳定的,function完善的cookiepipe理工具,实现了“HTTP状态pipe理机制” – RFC 6265 。 它甚至提供了多种选项来使用cookie存储来保存(存储)cookie。