Подтвердить что ты не робот

NodeJS и HTTP-клиент. Поддерживаются ли файлы cookie?

NodeJS - фантастический инструмент и быстро пылающий.

Мне интересно, поддерживает ли HTTPClient куки файлы, и если их можно использовать для имитации очень сильного базового поведения браузера!


Помощь будет очень оценена! =)


EDIT:

Обнаружено: node-httpclient (кажется полезным!) не работает!

4b9b3361

Ответ 1

Просто получайте файлы cookie из Set-Cookie param в заголовках ответов и отправляйте их обратно с будущими запросами. Не должно быть трудно.

Ответ 2

Короткий ответ: нет. И это не так здорово.

Я реализовал это как часть 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: теперь это поддерживается по умолчанию в запросе.

Ответ 3

Если вы хотите использовать клиентскую часть cookie, вы можете использовать https://github.com/mikeal/request

М.

Ответ 4

В приведенном ниже коде демонстрируется использование файла 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
    }});
});

Ответ 6

Комплексное решение для файлов 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.