【问题标题】:NodeJS and HTTP Client - Are cookies supported?NodeJS 和 HTTP 客户端 - 是否支持 cookie?
【发布时间】:2010-04-11 01:14:14
【问题描述】:

NodeJS 是一个很棒的工具,而且速度极快。

我想知道 HTTPClient 是否支持 cookies 以及是否可以用来模拟非常基本的浏览器行为


非常感谢您的帮助! =)


编辑:

找到这个:node-httpclient(似乎很有用!)不工作!

【问题讨论】:

    标签: javascript http node.js


    【解决方案1】:

    简短的回答:不。而且它不是那么好。

    我将它作为 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 发送到哪些域,等等。

    出于这个原因,这可能永远不会直接包含在节点中。但请注意用户空间的发展。

    编辑:现在请求默认支持此功能。

    【讨论】:

      【解决方案2】:

      如果你想在客户端做 cookie,你可以使用https://github.com/mikeal/request

      M.

      【讨论】:

        【解决方案3】:

        功能完整的 cookie 解决方案

        这里其他答案中提出的自制解决方案没有涵盖很多特殊情况,很容易破坏并且缺乏很多标准功能,例如持久性。

        作为mentioned by isaacsrequest 模块现在具有真正的 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

        【讨论】:

          【解决方案4】:

          下面的代码演示了使用服务器端的 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
              }});
          });
          

          【讨论】:

            【解决方案5】:

            Zombie.js 是另一种选择,如果您想要类似浏览器的行为。它“跨请求维护状态:历史、cookie、HTML5 本地和会话存储等”。更多关于僵尸 cookie api 的信息:http://zombie.labnotes.org/API

            还有PhantomJSPhantomJS-based frameworks,比如CasperJS

            【讨论】:

              【解决方案6】:

              只需从响应标头中的 Set-Cookie 参数获取 cookie,然后将它们与未来的请求一起发回。应该不难。

              【讨论】:

              • 如果不难,也许您可​​以在答案中提供一个示例 sn-p?
              • 尝试使用多个Set-Cookie 字段
              猜你喜欢
              • 1970-01-01
              • 2017-03-13
              • 2017-01-01
              • 2021-10-31
              • 1970-01-01
              • 2021-02-08
              • 2012-07-23
              • 2017-09-08
              • 1970-01-01
              相关资源
              最近更新 更多