【问题标题】:posting to a remote url with expressjs使用 expressjs 发布到远程 url
【发布时间】:2013-03-14 12:27:12
【问题描述】:

我的 server.js 中有这个

app.post("/leadAPI/ed",function(request,response){
//api post code here
});

在这个发布请求中,我需要将请求正文中包含的数据发布到具有特定 URL 的某些外部 API,并使用 response.send 将响应发回。如何以干净的方式做到这一点。在expressjs中有什么内置的吗?

【问题讨论】:

标签: node.js backbone.js express


【解决方案1】:

正如 Andreas 所说,这不是 express 的职责。它的职责是在 HTTP 请求进来时调用你的函数。

您可以使用节点的内置 HTTP 客户端(正如 Andreas 在评论中提到的那样)向您的外部站点发出请求。

试试这样的:

var http = require('http');

app.post("/leadAPI/ed", function(request, response) {
  var proxyRequest = http.request({
      host: 'remote.site.com',
      port: 80,
      method: 'POST',
      path: '/endpoint/url'
    },
    function (proxyResponse) {
      proxyResponse.on('data', function (chunk) {
        response.send(chunk);
      });
    });

  proxyRequest.write(response.body);
  proxyRequest.end();
});

我确定您需要对其进行调整以处理分块响应并找出传输编码,但这就是您需要的要点。

详情见

http://nodejs.org/api/http.html

【讨论】:

  • 如何使用上述方法发布一些字段?比如说我想通过 post 方法将名字的值发送到 api url...我在哪里做呢?
  • 然后修改proxyRequest.write中的response.body引用,写一个自己构造的对象。您没有指定您想要原始请求数据的子集,所以我使用 response.body 来获取整个内容。
【解决方案2】:

我会为此使用 Mikeal Rogers 的 request 库:

var request = require('request');

app.post("/leadAPI/ed",function(req, res){
  var remote = request('remote url');

  req.pipe(remote);
  remote.pipe(res);
});

【讨论】:

  • @mikeal 这两行是什么意思 req.pipe(remote); remote.pipe(res);
  • @Picrasma 请求使用 nodejs Stream api,这对这类东西非常有用。请特别参阅documentation on stream.pipe()。基本上,它会在写入时将请求正文写入远程 URL,并在读取响应时将远程响应写入响应。
【解决方案3】:

你可以这样做。

var request = require('request');
var url = "<remote url>"
app.post("/leadAPI/ed",function(request, response){
  request.get({url:url, headers:request.headers, body:request.body}, function (err, res, body) {
    if(!err) {
      response.status(200).send(res) // JSON.stringify(res) if res is in json
    }
  })
})

请记住,两者的内容类型应该相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多