NodeJS и HTTP Client - Поддерживаются ли файлы cookie? - PullRequest
20 голосов
/ 11 апреля 2010

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

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


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


EDIT:

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

Ответы [ 6 ]

29 голосов
/ 29 мая 2010

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

Я реализовал это как часть npm, чтобы я мог загружать архивы из 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)
}

В файле есть много вещей, специфичных для npm (log, set и т. Д.), Но он должен показать вам общую идею. По сути, я собираю файлы cookie, чтобы при следующем перенаправлении я мог отправить их обратно при следующем запросе.

Я говорил с Майкеалом Роджерсом о добавлении такого рода функциональности к его утилите «request», в комплекте с поддержкой cookiejar с файловой системой, но это действительно довольно сложно. Вы должны отслеживать, на какие домены отправлять файлы cookie и т. Д.

По этой причине он, вероятно, никогда не будет включен в узел напрямую. Но следите за событиями в пользовательском пространстве.

EDIT: теперь это поддерживается по умолчанию в запросе.

4 голосов
/ 12 июля 2012

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

М.

3 голосов
/ 15 апреля 2010

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

2 голосов
/ 29 апреля 2015

Полнофункциональное решение для файлов cookie

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

Поскольку упоминается в isaacs , модуль request теперь имеет настоящую поддержку cookie. Они приводят примеры файлов cookie на своей странице Github .В примерах объясняется, как включить поддержку файлов cookie, добавив в ваш запрос файл cookie «tough-cookie» .

ПРИМЕЧАНИЕ. В банке cookie содержатся файлы cookie, которые помогают вам управлять ими.

Цитируя их Readme (по состоянию на апрель 2015 года):

Cookies отключены по умолчанию (в противном случае они будут использоваться в последующих запросах).Чтобы включить файлы cookie, установите jar на true (по умолчанию или в параметрах) и установите tough-cookie .

Управление файлами cookie осуществляется через модуль жесткого диска .Это стабильный, довольно функциональный инструмент управления файлами cookie, который реализует «Механизм управления состоянием HTTP» - RFC 6265 .Он даже предлагает множество вариантов сохранения (хранения) файлов cookie, используя cookie store .

.
2 голосов
/ 21 ноября 2012

Zombie.js - это еще один выбор, если вы хотите поведение, подобное браузеру. Он «поддерживает состояние между запросами: история, куки, локальный HTML5 и сеанс, и т. Д.». Больше информации о api cookie зомби: http://zombie.labnotes.org/API

Существует также PhantomJS и Фреймворки на основе PhantomJS , например CasperJS .

2 голосов
/ 10 ноября 2012

Приведенный ниже код демонстрирует использование куки со стороны сервера, вот демонстрационный API-сервер, который анализирует куки с http-клиента и проверяет хеш куки:

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
    }});
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...