2014-01-29 9 views
6

Ich sende eine HTTP-Anfrage mit der http.request -Funktion, und ich möchte die gesamte HTTP-Antwort wie Text lesen; das ist der rohe HTTP-Protokolltext. Ist es möglich? Ich habe den folgenden Code geschrieben, aber es funktioniert nicht.Lesen Sie raw http-Nachricht in Nodejs

// 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(); 
+0

Vielleicht ein anderes Knotenmodul könnte Ihnen helfen, ich bin mir nicht sicher. Zum Beispiel ist das Anfrage-Modul viel besser als das Basis-HTTP. https://github.com/mikeal/request – Vadorequest

+0

[Wofür benötigen Sie den Rohtext?] (http://meta.stackexchange.com/q/66377) – Bergi

Antwort

0

Unter der Annahme, diese Art von Werkzeugen in Ihrer Umgebung erlaubt sind, können Sie einen HTTP-Debug-Proxy wie Fiddler http://www.fiddler2.com/, laufen auf dem Sie die HTTP-Aufrufe und Antworten inspizieren können.

1

Streams2 und Streams1 nicht immer in der Lage, gut zu interagieren, siehe "Problem: Streams1 und Streams2 Dualität" in this video.

Ich habe versucht, Daten zu etwas niedrigeren Niveau als Streams zu hören und dieser Code druckt rohen HTTP-Antwort mit Header für mich:

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(); 
2

Wenn Sie Zugriff auf die rohen http Nachricht möchten, würde ich vorschlagen, mit die net module stattdessen, und schreibe die Anfrage selbst. So etwas wie dies für eine einfache GET Anfrage:

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); 
    }); 


}); 

Für eine POST-Anfrage application/x-www-form-urlencoded Daten sendet, können Sie den Antrag mit so etwas wie schreiben:

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"); 

, wo ich bin mit Buffer.byteLength weil Content-Length das erfordert Länge in Bytes, nicht in Zeichen. Denken Sie auch daran, dass data URL-codiert sein muss.

Wenn Sie nicht viel über das Format von HTTP-Nachrichten kennen, dann ist dies ein ordentliches Hotel zu starten:

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

Auch, wenn Sie nicht wissen, was die Codierung der Antwort Dann wirst du die Header zuerst analysieren müssen, um es herauszufinden, aber UTF-8 is by far the most common, also ist es eine ziemlich sichere Wette.