在节点中创建 REST API 时,如何将来自对外部网站的请求的 http 响应流式传输到原始 api 调用?

Posted

技术标签:

【中文标题】在节点中创建 REST API 时,如何将来自对外部网站的请求的 http 响应流式传输到原始 api 调用?【英文标题】:While creating a REST API in node, How can I stream http response from a request made to an external website to the original api call? 【发布时间】:2016-03-03 20:53:59 【问题描述】:

所以,我正在使用节点创建一个 REST API,我必须创建一个路由。 路由的目的:充当代理服务器并调用不同的外部网站并将其得到的响应返回给原始请求。 到目前为止,我有以下代码并且可以正常工作:

app.post('/v1/something/:_id/proxy',
    function(req, res, next) 
        // Basically make a request call to some external website and return
        // the response I get from that as my own response
        var opts = /*json containing proper uri, mehtod and json*/
        request(opts, function (error, responseNS, b) 
            if(error) return callback(error)
            if(!responseNS) return callback(new Error('!response'))

            return res.json(responseNS.body)
        )
    
)

我的问题是,如何流式传输我从外部网站获得的这个 http 响应。我的意思是,我想以流的形式获取响应,并在它以块的形式出现时继续返回它。 这可能吗?

【问题讨论】:

你的意思是一旦从外部网站的请求收到一个块,你想返回它? 如果你想通过管道传递它,你不应该在选项中使用 json 标志,因为在这种情况下你不应该关心内容。该标志隐式激活 JSON 反序列化,这将需要完整的响应缓冲区才能对其进行反序列化。 @LazarevAlexandr:是的。 【参考方案1】:

您可以将来自外部源的传入响应直接通过管道传输到您的应用发送到浏览器的响应,如下所示:

app.post('/v1/something/:_id/proxy',
function(req, res, next) 
    // Basically make a request call to some external website and return
    // the response I get from that as my own response
    var opts = /*json containing proper uri, mehtod and json*/
    request(opts, function (error, responseNS, b) 
        if(error) return callback(error)
        if(!responseNS) return callback(new Error('!response'))

        return res.json(responseNS.body)
    ).pipe(res);
);

【讨论】:

只有一个问题,“管道”是否解决了我们一收到响应就发送响应块的目的?【参考方案2】:

通过请求,您可以将传入响应直接通过管道传输到任一文件流、其他请求或您的 api 发送到浏览器的响应。喜欢

function (req, res, next) 
    request
      .get('http://example.com/doodle.png')
      .pipe(res)    

在您的情况下类似,只是通过管道响应。

app.post('/v1/something/:_id/proxy',
    function(req, res, next) 
        // Basically make a request call to some external website and return
        // the response I get from that as my own response
        var opts = /*json containing proper uri, mehtod and json*/
        request(opts, function (error, responseNS, b) 
            if(error) return callback(error)
            if(!responseNS) return callback(new Error('!response'))
        ).pipe(res);
    
)

【讨论】:

以上是关于在节点中创建 REST API 时,如何将来自对外部网站的请求的 http 响应流式传输到原始 api 调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在“Zapier 代码”中编写节点获取(Rest-API)?

Django:项目使用来自 REST API 的数据,如何在这个系统中使用外部应用程序?

如何从 REST API 传递类别属性值

使用 WP-API 节点模块时如何限制返回的 Wordpress REST-API 字段

如何在使用 REST API 创建 Kafka 连接器时定义模式

当我的目标是动态时如何解决 Rest API 的 CORS 错误