你能够从另一个服务器发送HTTP响应吗?

6

也许这个问题很傻。

最近我一直在使用Node.js,喜欢它设置服务器和进行请求等方便的功能。虽然我还没有尝试过,但是我想知道如何将数据从一个请求转发到另一个服务器,并使第二个服务器向客户端发送响应。

这是否可行?

例如:

客户端X -> 服务器A -> 服务器B -> 客户端X

让我困惑的是如何向同一个客户端发送信息?虽然这些信息应该出现在请求头中,但需要将这些信息转发给服务器B吗?

我现在的情况是在一个Node.js服务器上接收请求,想将一些数据转发到我创建的Laravel API并从那里向客户端发送响应。

感谢您的回答。

Matt


1
HTTP响应实际上只是客户端请求的响应,不能主动发送给客户端。如果服务器无缘无故地发送未经请求的“响应”,客户端将不会处理。你是否想象过客户端X同时向服务器A和服务器B发送请求?或者客户端X在较晚的时间向服务器B发送请求? - apsillers
或者只让服务器A调用API并将结果返回给客户端X,这样可以吗?(即,客户端X不需要知道服务器B的存在) - apsillers
1
你想让服务器B欺骗其IP地址并冒充服务器A响应服务器A的请求吗?我也很想知道答案 :) 好问题!我已经考虑了好几年,但没有进行调查。 - Lord Loh.
2个回答

4
这对于使用request模块很容易实现。
以下是“服务器A”的示例实现,它会将所有请求原封不动地转发到服务器B,并将其响应发送回客户端:
'use strict';
const http    = require('http');
const request = require('request').defaults({ followRedirect : false, encoding : null });

http.createServer((req, res) => {
  let endpoint = 'http://server-b.example.com' + req.url;
  req.pipe(request(endpoint)).pipe(res);
}).listen(3000);

你可以使用http模块来实现这个功能,但是request更加容易。

任何对http://server-a.example.com/some/path/here的请求都会被传递到服务器B,路径相同(包括方法、查询字符串、正文数据等)。

followRedirectencoding是我在像这样将请求传递给其他服务器时发现有用的两个选项。它们在这里有记录。


3
正如已经提到的那样,它不是那样工作的。服务器B无法向客户端X发送响应,因为这将作为对没有请求的响应。客户端X从未要求服务器B任何内容。

meme

这是它的工作原理:
  1. 客户端 X服务器 A 发出请求
  2. 在该请求的上下文中,服务器 A服务器 B(您的 Laravel API)发出请求
  3. 服务器 A 记录从 服务器 B 收到的响应
  4. 服务器 A 然后将响应发送回 客户端 X
示例实现:
var http = require('http');

function onRequest(request, response) {
    var options = {
        host: 'stackoverflow.com',
        port: 80,
        path: '/'
    };

    var body = '';

    http.get(options, function(responseFromRemoteApi) {
        responseFromRemoteApi.on('data', function(chunk) {
            // When this event fires we append chunks of 
            // response to a variable
            body += chunk;
        });
        responseFromRemoteApi.on('end', function() {
            // We have the complete response from Server B (stackoverflow.com)
            // Send that as response to client
            response.writeHead(200, { 'Content-type': 'text/html' });
            response.write(body);
            response.end();
        });
    }).on('error', function(e) {
        console.log('Error when calling remote API: ' + e.message);
    });
}

http.createServer(onRequest).listen(process.env.PORT || 3000);
console.log('Listening for requests on port ' + (process.env.PORT || 3000));

这使得服务器A成为代理。服务器B能够响应伪装成服务器A(欺骗IP和所有信息)的客户端吗? - Lord Loh.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接