【发布时间】:2010-04-11 01:14:14
【问题描述】:
NodeJS 是一个很棒的工具,而且速度极快。
我想知道 HTTPClient 是否支持 cookies 以及是否可以用来模拟非常基本的浏览器行为!
非常感谢您的帮助! =)
编辑:
找到这个:node-httpclient(似乎很有用!)不工作!
【问题讨论】:
标签: javascript http node.js
NodeJS 是一个很棒的工具,而且速度极快。
我想知道 HTTPClient 是否支持 cookies 以及是否可以用来模拟非常基本的浏览器行为!
非常感谢您的帮助! =)
编辑:
找到这个:node-httpclient(似乎很有用!)不工作!
【问题讨论】:
标签: javascript http node.js
简短的回答:不。而且它不是那么好。
我将它作为 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 讨论过将这种功能添加到他的“请求”实用程序中,并支持文件系统支持的 cookiejar,但这确实非常棘手。您必须跟踪将 cookie 发送到哪些域,等等。
出于这个原因,这可能永远不会直接包含在节点中。但请注意用户空间的发展。
编辑:现在请求默认支持此功能。
【讨论】:
如果你想在客户端做 cookie,你可以使用https://github.com/mikeal/request
M.
【讨论】:
功能完整的 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,使用cookie store。
【讨论】:
下面的代码演示了使用服务器端的 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
}});
});
【讨论】:
Zombie.js 是另一种选择,如果您想要类似浏览器的行为。它“跨请求维护状态:历史、cookie、HTML5 本地和会话存储等”。更多关于僵尸 cookie api 的信息:http://zombie.labnotes.org/API
【讨论】:
只需从响应标头中的 Set-Cookie 参数获取 cookie,然后将它们与未来的请求一起发回。应该不难。
【讨论】:
Set-Cookie 字段