在Nodejs中读取原始http消息

我使用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(); 

如果你想访问原始的http消息,我build议使用networking模块 ,并自己写请求。 像这样的一个简单的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/

另外,如果你不知道响应的编码是什么,那么你必须首先parsing标题才能发现,但UTF-8是最常见的,所以这是一个非常安全的select。

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

我试图在比stream更低的级别监听数据,这个代码打印原始的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(); 

假设您的环境允许使用这些工具,您可以运行HTTPdebugging代理,例如Fiddler http://www.fiddler2.com/ ,该代理可以检查HTTP调用和响应。