【问题标题】:How do I create a HTTP Client Request with a cookie?如何使用 cookie 创建 HTTP 客户端请求?
【发布时间】:2023-03-09 23:35:01
【问题描述】:

我有一个检查请求 cookie 的 node.js Connect 服务器。要在节点中测试它,我需要一种方法来编写客户端请求并将 cookie 附加到它。我知道 HTTP 请求为此具有“cookie”标头,但我不确定如何设置和发送——我还需要在同一个请求中发送 POST 数据,所以我目前正在使用 danwrong 的 restler 模块,但它似乎不允许我添加该标题。

关于如何使用硬编码的 cookie 和 POST 数据向服务器发出请求有什么建议吗?

【问题讨论】:

    标签: http-headers node.js


    【解决方案1】:

    此答案已弃用,请参阅@ankitjaininfo 的答案below 以获得更现代的解决方案


    以下是我认为您仅使用节点 http 库使用数据和 cookie 发出 POST 请求的方式。此示例是发布 JSON,如果您发布不同的数据,请相应地设置您的内容类型和内容长度。

    // NB:- node's http client API has changed since this was written
    // this code is for 0.4.x
    // for 0.6.5+ see http://nodejs.org/docs/v0.6.5/api/http.html#http.request
    
    var http = require('http');
    
    var data = JSON.stringify({ 'important': 'data' });
    var cookie = 'something=anything'
    
    var client = http.createClient(80, 'www.example.com');
    
    var headers = {
        'Host': 'www.example.com',
        'Cookie': cookie,
        'Content-Type': 'application/json',
        'Content-Length': Buffer.byteLength(data,'utf8')
    };
    
    var request = client.request('POST', '/', headers);
    
    // listening to the response is optional, I suppose
    request.on('response', function(response) {
      response.on('data', function(chunk) {
        // do what you do
      });
      response.on('end', function() {
        // do what you do
      });
    });
    // you'd also want to listen for errors in production
    
    request.write(data);
    
    request.end();
    

    您在Cookie 值中发送的内容应该取决于您从服务器收到的内容。维基百科对这些东西的描述非常好:http://en.wikipedia.org/wiki/HTTP_cookie#Cookie_attributes

    【讨论】:

    • 我将自己发送 JSON 数据,所以这很好,但为了与其他测试保持一致,我希望有一种方法可以使用 restler 库来做到这一点
    • 我明白了,您的问题并不清楚restler 很重要,抱歉。 github.com/danwrong/restler 的自述文件说 post 方法可以在 options 参数中指定标题。您只需将 Cookie 放在那里:rest.post(url, { data: 'your data', headers { Cookie: 'your cookie' } })
    • 哦,我试过小写的“cookie”。反正我已经改写成使用http客户端了,以后再考虑改回来。
    • @Vanwaril:我不会费心把它写回去,我有一种奇怪的感觉,它不区分大小写,你会浪费时间,因为唯一的原因是如果有一些restler 中的奇怪代码与 HTTP 的典型代码相反。
    • 现在不推荐使用http.createClient。参考我的新答案。
    【解决方案2】:

    现在不推荐使用http.createClient。您可以在选项集合中传递标头,如下所示。

    var options = { 
        hostname: 'example.com',
        path: '/somePath.php',
        method: 'GET',
        headers: {'Cookie': 'myCookie=myvalue'}
    };
    var results = ''; 
    var req = http.request(options, function(res) {
        res.on('data', function (chunk) {
            results = results + chunk;
            //TODO
        }); 
        res.on('end', function () {
            //TODO
        }); 
    });
    
    req.on('error', function(e) {
            //TODO
    });
    
    req.end();
    

    【讨论】:

    • 感谢一百万 @ankitjaininfo。我被困在试图遵循 HTTP 节点文档中所说的内容:“set-cookie 和 cookie 标头,它们表示为值数组”link
    【解决方案3】:

    您可以使用Requestify 来做到这一点,这是我为 nodeJS 编写的一个非常简单和酷的 HTTP 客户端,它支持轻松使用 cookie,还支持缓存。

    要执行带有 cookie 的请求,只需执行以下操作:

    var requestify = require('requestify');
    requestify.post('http://google.com', {}, {
        cookies: {
            sessionCookie: 'session-cookie-data'   
        }
    });
    

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多