Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何最好地从nodejs网络响应中提取内容正文?_Node.js_Http - Fatal编程技术网

Node.js 如何最好地从nodejs网络响应中提取内容正文?

Node.js 如何最好地从nodejs网络响应中提取内容正文?,node.js,http,Node.js,Http,使用以下代码: var net = require("net"); var client = new net.Socket(); client.connect(8080,"localhost",function() { client.write("GET /edsa-jox/testjson.json HTTP/1.1\r\n"); client.write("Accept-Encoding: gzip\r\n

使用以下代码:

var net = require("net");
var client = new net.Socket();
client.connect(8080,"localhost",function() {
    client.write("GET /edsa-jox/testjson.json HTTP/1.1\r\n");
    client.write("Accept-Encoding: gzip\r\n");
    client.write("Host: localhost:8080\r\n\r\n");
  }
);

client.on("data", function(data) {
  console.log(data.toString("utf-8", 0, data.length));
});
我得到以下回应:

HTTP/1.1 200 OK
Date: Thu, 20 May 2021 22:45:26 GMT
Server: Apache/2.4.25 (Win32) PHP/5.6.30
Last-Modified: Thu, 20 May 2021 20:14:17 GMT
ETag: "1f-5c2c89677c5c7"
Accept-Ranges: bytes
Content-Length: 31
Content-Type: application/json

{"message":"message from json"}
这个响应会立即显示在控制台中。但由于它来自于“数据”事件,我想如果反应更大,它会成批出现

因此,我还测试了以下各项(所有其他方面都相同):

我认为我可以使用事件“end”来确保在做其他事情之前我拥有完整的数据集。我想这是可行的,但出乎意料的是,“1”立即显示,但在触发“结束”事件之前需要几秒钟

问题1)与上次执行的“数据”事件相比,“结束”事件为什么会有这样的延迟?有更好的方法吗

问题2)有上面的回答,其中包含一堆标题和一个内容体。提取身体部位的最佳方法是什么


注意,我想用网络库而不是fetch或http库(或任何其他抽象)来实现这一点。我希望它尽可能快。

我只能看到两个有效的理由来手动完成这一切:

  • 极端速度需要= >然后你应该考虑使用“go”或另一种编译语言
  • 学习(总是有趣的) 我建议您使用express或任何其他npm包来处理所有问题,而无需重新发明轮子
但是,我将帮助您了解我所知道的: 第一件事是正确解码ut8字符串。您需要使用string_解码器,因为如果数据块不完整,并且您调用data.toString('utf8'),则会附加一个损坏的字符。不经常发生,但很难调试

以下是一种有效的方法:

const { StringDecoder } = require('string_decoder');
var decoder = new StringDecoder('utf8');
var stdout = '';
stream.on('data', (data) => {
    stdout += decoder.write(data);
});

然后回答您的问题:

  • 我不知道,可能和gzip有关。服务器停止连接的速度可能很慢,也可能是客户端的错误。或者网络本身。我会尝试与其他客户机/服务器,以确保,并开始分析

  • 您需要阅读http规范来处理所有边缘情况(http1/websockets/http2)。但我认为你很幸运,头球和身体之间总是有一条双换行线。然后,如果对来自流的数据进行循环,则在解码后,可以逐个字符搜索此模式\n\n。之后的任何东西都将是尸体。 我考虑的一个特殊情况是保持活动:如果客户端和服务器处于保持活动模式,则调用之间的连接不会关闭。您可能需要解析“Content-Length”标题以了解要等待的字符数


  • 谢谢你的回答很有帮助。关于Q1)当我添加connection:close header时,立即触发end事件。关于第2个问题)搜索双换行符有效(还按照您的建议添加了解码器)。
    const { StringDecoder } = require('string_decoder');
    var decoder = new StringDecoder('utf8');
    var stdout = '';
    stream.on('data', (data) => {
        stdout += decoder.write(data);
    });