你能从其他服务器发送HTTP响应吗?

时间:2016-09-12 15:10:29

标签: node.js http laravel-5 server response

或许是愚蠢的问题。

我最近一直在玩Node.js,并且喜欢设置服务器和发出请求等等是多么容易。我还没有尝试过,但我想知道如何从一个转发数据请求到另一台服务器,让第二台服务器向客户端发送响应。

这可能吗?

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

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

我正处于接受Node.js服务器上的请求的情况,并希望将一些数据转发到我创建的Laravel API并将响应发送到那里的客户端表单。

感谢您的回答,

马特

2 个答案:

答案 0 :(得分:2)

使用request模块非常容易。

这是"服务器A"的一个示例实现,它将按原样将所有请求传递给服务器B,并将其响应发送回客户端:

@Entity
public class Resolution {
    public static final int serialId = 106;

    private int id;
    private Integer height;
    private Integer width;
    private Type typeId;
    private Collection<Smartphone> resolutionId;

    @Id
    @Column(name = "id")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Basic
    @Column(name = "height")
    public Integer getHeight() {
        return height;
    }

    public void setHeight(Integer height) {
        this.height = height;
    }

    @Basic
    @Column(name = "width")
    public Integer getWidth() {
        return width;
    }

    public void setWidth(Integer width) {
        this.width = width;
    }

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "type_id", referencedColumnName = "id", nullable = false)
    public Type getTypeId() {
        return typeId;
    }

    public void setTypeId(Type typeId) {
        this.typeId = typeId;
    }

    @LazyCollection(LazyCollectionOption.FALSE)
    @OneToMany(mappedBy = "resolutionId")
    public Collection<Smartphone> getResolutionId() {
        return resolutionId;
    }

    public void setResolutionId(Collection<Smartphone> resolutionId) {
        this.resolutionId = resolutionId;
    }
}

您可以使用http模块实现此功能,而不是'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); ,但request可让您更轻松。

request的任何请求都将以相同的路径(+方法,查询字符串,正文数据等)传递给服务器B.

http://server-a.example.com/some/path/herefollowRedirect是我在将请求传递给其他服务器时发现有用的两个选项。它们记录在案here

答案 1 :(得分:1)

正如已经提到的,它并不像那样。 服务器B 无法将响应发送回客户端X ,因为这将作为对NO REQUEST的响应。 客户端X 从未向服务器B 询问任何内容。

meme

以下是其工作原理:

  1. 客户端X 服务器A
  2. 发出请求
  3. 在该请求的上下文中,服务器A 服务器B (您的Laravel API)发出请求
  4. 服务器A 会记录从服务器B
  5. 收到的回复
  6. 服务器A 然后将回复发送回客户端X
  7. 示例实施:

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