NodeJS和HTTP客户端 - 是否支持cookie?

时间:2010-04-11 01:14:14

标签: javascript http node.js

NodeJS 是一个非常棒的工具,速度极快。

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


非常感谢帮助! =)


修改

发现这个:node-httpclient(似乎很有用!) 无效!

6 个答案:

答案 0 :(得分:29)

简答:不。它并不是那么好。

我将此作为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”工具中,完成支持文件系统支持的cookiejar,但这真的很棘手。您必须跟踪要将Cookie发送到哪些域,依此类推。

由于这个原因,这可能永远不会直接包含在节点中。但要注意用户空间的发展。

编辑:默认情况下,现在支持此功能。

答案 1 :(得分:4)

只需从响应标头中的Set-Cookie param获取Cookie,然后将其与以后的请求一起发回。不应该很难。

答案 2 :(得分:4)

如果您希望使用Cookie客户端,可以使用https://github.com/mikeal/request

微米。

答案 3 :(得分:2)

下面的代码演示了如何在服务器端使用cookie,这是一个演示API服务器,它解析来自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
    }});
});

答案 4 :(得分:2)

如果您想要类似浏览器的行为,

Zombie.js是另一种选择。它“跨请求维护状态:历史,cookie,HTML5本地和会话连接等”。有关zombie的cookie api的更多信息:http://zombie.labnotes.org/API

还有PhantomJSPhantomJS-based frameworks,例如CasperJS

答案 5 :(得分:2)

功能完整的Cookie解决方案

这里提出的其他答案中提出的自制解决方案并未涉及很多特殊情况,很容易破解并且缺乏很多标准功能,例如持久性。

作为mentioned by isaacsrequest模块现在具有真正的cookie支持。 They provide examples with cookies on their Github page。这些示例说明了如何通过向您的请求添加"tough-cookie" cookie jar来启用Cookie支持。

注意:Cookie jar包含并帮助您管理Cookie。

引用他们的Readme(截至2015年4月):

  

默认情况下禁用Cookie(否则,它们将被用于   后续要求)。要启用Cookie,请将jar设置为true(在...中)   默认值或选项)并安装tough-cookie

Cookie管理是通过tough-cookie module提供的。它是一个稳定的,功能完备的cookie管理工具,可以实现"HTTP State Management Mechanism" - RFC 6265。它甚至提供了多种选项来使用cookie store来保存(存储)Cookie。