Ответ 1
Просто получайте файлы cookie из Set-Cookie
param в заголовках ответов и отправляйте их обратно с будущими запросами. Не должно быть трудно.
NodeJS - фантастический инструмент и быстро пылающий.
Мне интересно, поддерживает ли HTTPClient куки файлы, и если их можно использовать для имитации очень сильного базового поведения браузера!
Помощь будет очень оценена! =)
EDIT:
Обнаружено: node-httpclient (кажется полезным!) не работает!
Просто получайте файлы cookie из Set-Cookie
param в заголовках ответов и отправляйте их обратно с будущими запросами. Не должно быть трудно.
Короткий ответ: нет. И это не так здорово.
Я реализовал это как часть npm, чтобы я мог загружать tarballs из github. Вот код, который делает это: 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)
}
В файле появилось много специфических нпм (журнал, набор и т.д.), но он должен показать вам общую идею. В принципе, я собираю файлы cookie, чтобы я мог отправить их обратно при следующем запросе, когда я перенаправляюсь.
Я разговаривал с Mikeal Rogers о добавлении такого рода функций в свой "запрос", в комплекте с поддержкой файла cookiejar с файловой системой, но это действительно довольно сложно. Вы должны отслеживать, какие домены отправлять файлы cookie, и т.д.
Это, вероятно, никогда не будет включено в node напрямую, по этой причине. Но следите за событиями в пользовательском пространстве.
EDIT: теперь это поддерживается по умолчанию в запросе.
Если вы хотите использовать клиентскую часть cookie, вы можете использовать https://github.com/mikeal/request
М.
В приведенном ниже коде демонстрируется использование файла cookie с сервера, здесь - сервер API демо, который анализирует файлы cookie с http-клиента и проверяет хеш файл 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 и сеанс и т.д.". Подробнее о zombie cookie api: http://zombie.labnotes.org/API
Существует также PhantomJS и фреймворки на основе PhantomJS, например CasperJS.
Комплексное решение для файлов cookie
Самодельные решения, предлагаемые в других ответах здесь, не охватывают много особых случаев, могут легко ломаться и испытывать недостаток в множестве стандартных функций, таких как настойчивость.
Как упомянутый isaacs, модуль request теперь имеет значение true поддержка файлов cookie. Они приводят примеры файлов cookie на странице Github. В примерах объясняется, как включить поддержку файлов cookie, добавив к вашему запросу "hard-cookie" cookie jar.
ПРИМЕЧАНИЕ. Кувшин cookie содержит и помогает вам управлять своими файлами cookie.
Чтобы процитировать их Readme (по состоянию на апрель 2015 года):
Cookies отключены по умолчанию (иначе они будут использоваться в последующие запросы). Чтобы включить файлы cookie, установите
jar
наtrue
(либо в по умолчанию или параметры) и установите tough-cookie.
Управление файлами cookie осуществляется через жесткий файл cookie. Это стабильный, но полнофункциональный инструмент управления файлами cookie, который реализует "Механизм управления HTTP-государством" - RFC 6265. Он даже предлагает множество вариантов сохранения (хранения) файлов cookie с помощью хранилища файлов cookie.