【问题标题】:Read raw http message in Nodejs在 Nodejs 中读取原始 http 消息
【发布时间】:2014-06-21 05:06:25
【问题描述】:

我正在使用 http.request 函数发送一个 http 请求,我想像文本一样阅读整个 http 响应;即原始 http 协议文本。可能吗?我已经编写了以下代码,但它不起作用。

// Set up the request
console.log('Sending request');
var post_req = http.request(post_options, function(res) {
    res.setEncoding('utf8');
    console.log('Response statusCode: ' + res.statusCode);
//    res.on('data', function (chunk) {
//        console.log('Response: ' + chunk);
//    });
//    res.on('end', function() {});
});

post_req.on('socket', function (socket) {
    var response = "";
    socket.on('data', function(chunk){
    console.log(chunk);
    });
});

// post the data
post_req.write(post_data);
post_req.end();

【问题讨论】:

标签: javascript node.js sockets http httpresponse


【解决方案1】:

如果您想访问原始 http 消息,我建议改用 net module,并自己编写请求。一个简单的 GET 请求是这样的:

var net = require('net');

var host = 'stackoverflow.com',
    port = 80,
    socket = net.connect(port, host, function() {

    var request = "GET / HTTP/1.1\r\nHost: " + host + "\r\n\r\n",
        rawResponse = "";

    // send http request:
    socket.end(request);

    // assume utf-8 encoding:
    socket.setEncoding('utf-8');

    // collect raw http message:
    socket.on('data', function(chunk) {
        rawResponse += chunk;
    });
    socket.on('end', function(){
        console.log(rawResponse);
    });


});

对于发送 application/x-www-form-urlencoded 数据的 POST 请求,您可以使用以下内容编写请求:

function writePOSTRequest (data, host, path) {
    return "POST " + path + " HTTP/1.1\r\n" +
            "Host: " + host + "\r\n" +
            "Content-Type: application/x-www-form-urlencoded\r\n" +
            "Content-Length: " + Buffer.byteLength(data) + "\r\n\r\n" +
            data + "\r\n\r\n";

}

var data = "name1=value1&name2=value2",
    request = writePOSTRequest(data, host, "/path/to/resource");

我在哪里使用Buffer.byteLength,因为Content-Length 需要以字节为单位的长度,而不是字符。另外,请记住data 必须经过 URL 编码。

如果您对 HTTP 消息的格式不太了解,那么这是一个不错的起点:

http://jmarshall.com/easy/http/

另外,如果您不知道响应的编码是什么,那么您必须先解析标头才能找出答案,但UTF-8 is by far the most common 所以这是一个非常安全的选择。

【讨论】:

    【解决方案2】:

    Streams2 和 Streams1 并不总是能够很好地互操作,请参阅 this video 中的“问题:streams1 和 streams2 对偶性”。

    我尝试在比流低一点的级别监听数据,这段代码为我打印带有标头的原始 http 响应:

    var http = require('http');
    var raw = '';
    
    console.log('Sending request');
    var req = http.request({host: 'stackoverflow.com'}, function(res) {
      watch(res, 'res');
      res.on('end', function() {
        console.log(raw);
      });
      res.on('data', function(data) {
        // if we don't attach 'data' handler here 'end' is not called
      });
    });
    
    
    req.on('socket', function (socket) {
      socket.resume();
      var oldOndata = socket.ondata;
      socket.ondata = function(buf, start, end) {
        raw += buf.slice(start, end).toString();
        oldOndata.call(socket, buf, start, end);
      };
    });
    
    req.end();
    

    【讨论】:

      【解决方案3】:

      假设您的环境中允许使用此类工具,您可以运行 HTTP 调试代理,例如 Fiddler http://www.fiddler2.com/,它使您能够检查 HTTP 调用和响应。

      【讨论】:

        猜你喜欢
        • 2018-07-09
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多