2011-11-01 28 views
75

問題非常簡單。我想使用Node.js服務器作爲代理來記錄,驗證和轉發HTTP查詢到後端HTTP服務器(PUT,GET和DELETE請求)。如何使用Node.js創建外部HTTP請求

我應該爲此使用什麼庫?恐怕我找不到一個。

回答

121

支持的NodeJS作爲http.request標準模塊: http://nodejs.org/docs/v0.4.11/api/http.html#http.request

var http = require('http'); 

var options = { 
    host: 'example.com', 
    port: 80, 
    path: '/foo.html' 
}; 

http.get(options, function(resp){ 
    resp.on('data', function(chunk){ 
    //do something with chunk 
    }); 
}).on("error", function(e){ 
    console.log("Got error: " + e.message); 
}); 
+10

我建議添加'resp.setEncoding('utf8');'(或任何你使用的編碼)來獲取數據爲utf8字符串。如果我理解正確,否則你會得到Buffer對象,並且如果多字節字符被分成兩個塊,可能最終會遇到多字節字符的問題。 (剛剛調試了一段時間的相關問題) – Touko

+7

我已經開始使用'request' npm模塊了。 – chovy

0

你可以使用node.js http模塊來做到這一點。您可以查看文檔Node.js HTTP

您需要將查詢字符串也傳遞給其他HTTP服務器。你應該在ServerRequest.url

一旦你擁有了這些信息,你可以通過後端HTTP服務器和端口中,你將在http.request()

7

提供我將結合node-http-proxyexpress的選項。

節點HTTP代理服務器將支持通過RoutingProxy您的node.js的Web服務器內的代理(見稱爲另一個HTTP服務器內代理請求的例子)。

在您的自定義服務器邏輯中,您可以使用express進行身份驗證。請參閱auth sample here for an example

結合這兩個例子應該給你你想要的。

4

您可以使用內置的http模塊來執行http.request()

但是,如果你想簡化你可以使用一個模塊的API,如superagent

+3

更加健壯的API確實如此。我不怪責節點只提供低級別的API,但開始處理大塊數據只是簡單的煩人。 –

1

節點HTTP代理是一個很好的解決方案,是由@hross上述建議。如果您在使用節點時沒有死心,我們使用NGINX來做同樣的事情。它非常適合節點。我們使用它來處理SSL請求,然後將它們轉發到節點。它也可以處理緩存和轉發路由。好極了!

7

我最近發現REQUESTIFY

GET請求:

requestify.get('http://example.com').then(function(response) { 
    // Get the response body 
    response.getBody(); 
}); 

郵政JSON:

requestify.post('http://example.com', { 
     hello: 'world' 
    }) 
     .then(function(response) { 
      // Get the response body (JSON parsed or jQuery object for XMLs) 
      response.getBody(); 

      // Get the raw response body 
      response.body; 
     }); 

希望這有助於