记录一下transfer-encoding chunked , Transfer-Encoding 的作用

Transfer-Encoding字段的含义

Transfer-Encoding字段是HTTP 1.1规范中定义的一个字段,它用于标识在传输HTTP响应正文时所使用的编码方式。这个字段通常用于指示是否采用分块传输编码(chunked encoding)以及其他可能的编码方式。分块传输编码是一种将响应数据分成多个小块(chunks)的传输方式,每个小块的大小和内容长度是可变的。这种编码方式使得服务器可以逐步发送响应数据,而无需等待整个响应完全生成。这对于大文件或长时间运行的响应非常有用,因为它允许客户端在接收到部分响应时就开始处理它,而不需要等待整个响应完成。

Transfer-Encoding字段通常会包含多个编码方式,它们按照优先级顺序排列,最优先的编码方式在前面。当接收到响应时,客户端会按照这个列表中的顺序查找支持的编码方式,并选择第一个支持的方式来解码响应数据。如果客户端不支持任何列出的编码方式,那么它必须放弃解码响应,或者如果有其他备选方式,可以尝试使用备选方式。

Chunked传输编码

Chunked传输编码是HTTP中的一种传输编码方式,它允许服务器将响应数据分成一系列小块(chunks)来传输。每个chunk都有一个头部,用于指示其大小,然后是一个回车换行(CRLF)分隔符,接着是chunk的实际数据,最后再加上一个CRLF分隔符。这个过程一直持续到最后一个chunk,它的大小为0,表示响应数据的结束。

使用Transfer-Encoding字段和chunked传输编码方式有一些重要的优点

分块传输:允许服务器逐步生成和发送响应数据,而无需等待整个响应生成完成。这对于大文件或需要长时间计算的响应非常有用,因为客户端可以边接收数据边处理它。
降低内存开销:对于大型响应,使用分块传输编码可以降低服务器和客户端的内存开销,因为它们不需要同时存储整个响应。
实时数据传输:允许服务器实时传输数据,而无需等待整个数据生成。这在一些实时应用程序中非常有用,如聊天应用或实时游戏。
减少延迟:分块传输可以减少客户端首次接收到数据的等待时间,因为服务器可以立即发送可用的数据块。
容错性:如果连接意外断开,客户端仍然可以处理已接收的chunk,而无需丢弃整个响应

对于spring来说

Spring Boot默认会处理Content-Length,但在某些情况下,如流式响应大文件,你可能需要显式设置Transfer-Encoding: chunked

@GetMapping("/large-file")
public ResponseEntity<Resource> serveLargeFile() {
    Resource resource = new UrlResource("file:/path/to/large/file");
    return ResponseEntity.ok()
                         .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
                         .contentLength(resource.contentLength())
                         .body(resource);
}

在上面的例子中,contentLength()方法会尝试设置Content-Length头,但如果文件太大或无法预知大小,Spring会自动切换到Transfer-Encoding: chunked。
通常情况下,Spring Boot和Servlet容器会自动处理Transfer-Encoding和Content-Length,但在特定场景下,你可能需要通过上述方法之一来进行干预

另外当Transfer-Encoding: 设置为chunked时,Content-Length会忽略,主要原因时Chunked传输编码方式的特点决定的

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值