NodeJS 是一个非常棒的工具,速度极快。
我想知道HTTPClient是否支持 cookies ,以及是否可以用来模拟非常基本的浏览器行为!
非常感谢帮助! =)
修改
发现这个:node-httpclient(似乎很有用!) 无效!
答案 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
答案 5 :(得分:2)
功能完整的Cookie解决方案
这里提出的其他答案中提出的自制解决方案并未涉及很多特殊情况,很容易破解并且缺乏很多标准功能,例如持久性。
作为mentioned by isaacs,request模块现在具有真正的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。