在 Node.js 中发出 HTTP 请求并接收 multipart/x-mixed-replace 响应 [英] Making HTTP request and receiving multipart/x-mixed-replace response in Node.js

查看:37
本文介绍了在 Node.js 中发出 HTTP 请求并接收 multipart/x-mixed-replace 响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要向外部服务器发出 HTTP GET 请求以开始接收事件.请求后,我立即得到 multipart/x-mixed-replace 响应.当一个事件发生时,它作为 XML 消息连同指示这部分结束的边界一起发送.

I need to make a HTTP GET request to foreign server to start receiving events. After request I immediately get multipart/x-mixed-replace response. When an event occurs, it's sent as XML message together with boundary indicating the end of this part.

现在我必须在 Node.js 中实现它.对于正常请求,我使用 node-rest-client,调用它的 get() 方法并将我的逻辑放在方法的回调中.问题是回调仅在响应完成时执行,并且使用 multipart/x-mixed-replace 直到连接关闭.

Now I must implement it in Node.js. With normal request I use node-rest-client, call its get() method and put my logic in method's callback. Trouble is that callback is executed only when response is finished and with multipart/x-mixed-replace it isn't until connection closes.

是否有其他一些 NPM 模块可以解决这个问题?我搜索了 NPM 注册表,但我发现的结果似乎不适合该任务.还是在纯 Node 中做更好?我是这样,请举个例子.

Is there some other NPM module that does the trick? I searched NPM registry but results I found seem unappropriate to the task. Or is it better to do it in pure Node? I so, please provide an example.

推荐答案

这是我自己的实现:

const webStream = {
    get: function (url, callback) {
        let webClient;

        if (url.startsWith("http://")) {
            webClient = require("http");
        } else if (url.startsWith("https://")) {
            webClient = require("https");
        } else {
            throw "Unsupported protocol.";
        }

        let clientRequest = webClient.get(url, function (response) {
            let context = {
                url: url,
                boundary: "",
                contentType: "",
                contentLength: 0
            };

            let headersCompleted = false;
            let bodyCompleted = false;
            let buffer = null;
            let receivedBodyChunk = 0;

            response.on("data", function (chunk) {
                if (!headersCompleted) {
                    let headers = chunk.toString().split(/\r?\n/);

                    context.boundary = headers[0].substring(2);
                    context.contentType = headers[1].split(":")[1].trim();
                    context.contentLength = parseInt(headers[2].split(":")[1]);

                    buffer = Buffer.alloc(context.contentLength);

                    headersCompleted = true;
                } else {
                    if (!bodyCompleted) {
                        if (receivedBodyChunk < context.contentLength) {
                            chunk.copy(buffer, receivedBodyChunk, 0, chunk.byteLength);

                            receivedBodyChunk += chunk.byteLength;

                            if (receivedBodyChunk === context.contentLength) {
                                bodyCompleted = true;
                            }
                        }
                    }

                    if (bodyCompleted) {
                        callback(buffer, context);

                        headersCompleted = false;
                        bodyCompleted = false;
                        buffer = null;
                        receivedBodyChunk = 0;
                    }
                }
            });
        });

        return {
            url: url,
            handler: clientRequest,
            on: function (type, listener) {
                clientRequest.on(type, listener);
            },
            abort: function () {
                clientRequest.abort();
            }
        };
    }
};

let stream = webStream.get("http://127.0.0.1:8090/", function (data, context) {
    // data: Received content (Buffer)
    // context: { url, boundary, contentType, contentLength }

    // TODO: Do something here...
});

// stream.abort();

// stream.on("error", function(e) {
//     console.log("Error: " + e.message);
// });

这篇关于在 Node.js 中发出 HTTP 请求并接收 multipart/x-mixed-replace 响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆