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

23

NodeJS 是一款强大而快速的工具。

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


非常感谢您的帮助!=)


编辑:

找到了这个:node-httpclient(看起来很有用!)不能工作!

6个回答

34

简短的回答:不行,而且效果并不好。

我将其作为npm的一部分实现,以便从github下载tarballs。以下是执行此操作的代码: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特定的内容(如log、set等),但它应该能够向你展示基本思路。基本上,我正在收集cookie,以便在下一次请求时将其发送回去,当我被重定向时。我已经与Mikeal Rogers讨论过将此类功能添加到他的“request”工具中,包括支持基于文件系统的cookiejar,但这实际上非常棘手。您必须跟踪要发送cookie的域等。由于这个原因,这可能永远不会直接包含在node中。但是请留意用户空间的发展。编辑:现在在Request中默认支持此功能。

4

3

一个完整的cookie解决方案

其他答案中提出的自制解决方案并不能涵盖很多特殊情况,容易出现问题,并且缺乏很多标准功能,例如持久性。

isaacs所提到的request模块现在支持真正的cookie。他们在Github页面上提供了带有cookie的示例。这些示例说明了如何通过向请求添加“tough-cookie” cookie jar来启用cookie支持。

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

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

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

cookie管理是通过tough-cookie模块提供的。它是一个稳定、相当完整的cookie管理工具,实现了“HTTP状态管理机制”-RFC 6265。甚至还提供了各种选项来持久化(存储)cookie,使用cookie store


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发出普通请求,我使用的是request模块,默认情况下会为每个请求传输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
    }});
});

1

只需从响应头中的Set-Cookie参数获取cookie,并在将来的请求中发送它们回去。不应该很难。


25
如果可以的话,您能否在回答中提供一个示例片段? - Jess Chadwick
尝试使用多个“Set-Cookie”字段进行操作。 - Benjineer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接