2011-11-01 29 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; 
     }); 

希望这有助于