NodeJS是一个神奇的工具,快速。NodeJS和HTTP客户端 - 是否支持Cookie?
我想知道如果支持的HTTPClient饼干和如果能以被用来模拟非常基本的浏览器的行为!
帮助将非常感谢! =)
编辑:
发现这一点:node-httpclient(似乎很有用)不工作!
NodeJS是一个神奇的工具,快速。NodeJS和HTTP客户端 - 是否支持Cookie?
我想知道如果支持的HTTPClient饼干和如果能以被用来模拟非常基本的浏览器的行为!
帮助将非常感谢! =)
编辑:
发现这一点: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,以便在重新定向时可以在下一个请求中发送它们。
我已经与Mikeal Rogers讨论了如何将这种功能添加到他的“request”util中,并完全支持由文件系统支持的cookiejar,但它确实非常棘手。你必须跟踪哪些域发送cookie,等等。
这可能永远不会直接包含在节点中,因此。但留意用户空间的发展。
编辑:现在,默认情况下在请求中支持。
如果你正在寻找做饼干客户端可以使用https://github.com/mikeal/request
M.
我按照他们的文档中描述的“jar:true”来尝试它,但是不工作... – 2014-07-13 12:59:47
下面的代码演示如何使用的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
}});
});
Zombie.js是另一种选择,如果你想要浏览器般的行为。它“在请求中保持状态:历史记录,Cookie,HTML5本地和会话记录等。”。关于僵尸的Cookie API的更多信息:http://zombie.labnotes.org/API
在这里其他的答案提出不包括大量的特殊情况下的cookies
自制的解决方案,一个功能完整的解决方案,可以轻松突破,缺乏大量的标准功能,如作为持久性。
由于mentioned by isaacs,request模块现在有真正的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。
如果不难,也许你可以在答案中提供一个示例代码片段? – 2016-04-28 05:00:56