Content-Length是什么

Content-Length 是一个实体消息首部,用来指明发送给接受方的消息主体的大小。Content-Length如果存在并且有效地话,则必须和消息内容的传输长度完全一致。否则就会导致异常 (特别地, HTTP1.0中这个字段可有可无)

Content-Length首部指示出报文中实体主体的字节大小。这个大小是包含了所有内容编码的, 比如,对文本文件进行了gzip压缩的话,Content-Length首部指的就是压缩后的大小而不是原始大小。

看下以下几种情况:

Content-Length == 实际长度

const http = require('http');
const server = http.createServer();
server.on('request', (req, res) => {
  if(req.url === '/') {
    res.setHeader('Content-Type', 'text/plain');
    res.setHeader('Content-Length', 10);
    res.write("helloworld");
  }
});
server.listen(8081, () => {
  console.log("成功启动");
});

Content-Length < 实际长度

res.setHeader('Content-Length', 8);

此时输出结果为 hellowor

那后面的字符哪里去了?实际上在http的响应体中直接被截取了。

Content-Length > 实际长度

如果Content-Length 比 实际长度大,服务端/客户端读取到消息结尾后,会等待下一个字节,自然会无响应直到超时。

res.setHeader('Content-Length', 12);

此时浏览器显示结果:

不确定Content-Length的值怎么办

如果不确定Content-Length的值怎么办,此时我们应该使用Transfer-Encoding:chunked

该字段表示分块传输数据,设置这个字段会自动产生两个效果:

  • Content-Length 字段会被忽略
  • 基于长连接持续推送动态内容

参考资料:

  • 《HTTP权威指南》
  • 用了这么久HTTP, 你是否了解Content-Length和Transfer-Encoding ?

更多推荐

HTTP协议中的Content-Length