简单测试Content-Length和Chunked两种不同的数据传输方式



Content-Length:按照数据长度进行数据传输

Chunk:按照块进行数据传输

如下图的样例请求,只是此时的Content-length为响应头中






一、代码测试

本文将使用ApiPost对两种不同的携带数据的方法进行测试

1、前期准备

1、准备一个ApiPost(自己使用postman进行测试时,无法测试成功)


2、编写对应的测试类

public class TestServerSocket {
	public static void main(String[] args) throws IOException {
		ServerSocket socket = new ServerSocket(8089);
		Socket accept = socket.accept();


		InputStream inputStream = accept.getInputStream();

		while (true) {
			byte[] bytes = new byte[100000];
			int readLength = inputStream.read(bytes);
			System.out.println(new String(bytes, 0, readLength));
			System.out.println("----完成一次数据接收over----");

		}
	}
}



2、测试Content-length

1、发送信息给8089端口,携带参数为name和age



2、查看控制台的数据信息


我们会发现默认携带的参数是content-length,且长度为269个字节。




3、测试Transfer-Encoding:chunked

1、修改ApiPost的请求头,添加对应的Transfer-Encoding参数



2、携带的参数和不变,再次使用ApiPost测试,查看控制台数据

此时请求的参数信息中,既包含了Content-length,又包含了Transfer-Encoding:chunked。但是底下的数据展示好像不一样,使用chunked后,数据由之前的单行字符串mobian,变成了多行数据。且mobian前面的6刚好是mobian字符串的长度,23前面的2刚好是23的长度,最后以0结尾。



总结:

即content-length是以数据的总的长度进行传输,而chunked是以分块的形式传输,每一块内部又根据前面的长度进行传输,直到遇到长度为0后,停止数据传输。如果两个同时存在,则content-length失效。






二、tomcat源码

tomcat中对Content-length和Transfer-Encoding的数据处理。

1、Request过程

一个请求在tomcat的内部调用逻辑这里不再赘述,不了解的可以参考我之前的博客:浅谈Tomcat接收到一个请求后在其内部的执行流程(源码)

最终是会调用到prepareRequest()方法



1、prepareRequest方法直到下图的位置后

  1. 首先会去获取transfer-encoding属性
  2. 然后根据后面配置的参数,传给addInputFilter方法



2、如果后面跟着的参数是chunked,那么将contentDelimitation设置为true



3、解析完transfer-encoding后

  1. 首先获取contentLength
  2. 在内容长度大于0后,会判断contentDelimitation的状态,如果我们配置了chunked那么改值为true
  3. contentDelimitation为true后,会移除content-length节点,即两者同时存在,contentlength失效




2、其他

如果你想了解contentlength和chunked两种方式具体的读取数据的逻辑代码,你可以查看InputFilter接口的两个实现类,即IdentityInputFilter(contentlength)和ChunkedInputFilter(chunked)两个类的doRead方法。

引用\[2\]:HTTP/1.1 400 Illegal character CNTL=0x10 \[Content-Type: text/html;charset=iso-8859-1, Content-Length: 70, Connection: close\] ResponseEntityProxy{\[Content-Type: text/html;charset=iso-8859-1,Content-Length: 70,Chunked: false\]} 说明了这是一个HTTP响应的状态行和头部信息。其中,状态行表示请求的处理结果,400表示客户端发送的请求有错误。头部信息包含了响应的内容类型(Content-Type)、内容长度(Content-Length)等信息。\[2\] 问题: ResponseEntityProxy{\[Content-Type: text/html,Content-Length: 4,Chunked: false\]} 是什么意思? 回答: ResponseEntityProxy{\[Content-Type: text/html,Content-Length: 4,Chunked: false\]} 是一个响应实体的代理对象,其中包含了响应的内容类型(Content-Type)为text/html,内容长度(Content-Length)为4,以及是否分块传输(Chunked: false)等信息。 #### 引用[.reference_title] - *1* *3* [接口自动化:HttpClient + TestNG + Java(二) - 第一个接口测试:get请求](https://blog.csdn.net/weixin_39721924/article/details/114456160)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【obs上传excel失败问题修复】Bad Message 400 reason: Illegal character CNTL=0x10](https://blog.csdn.net/carterslam/article/details/120025165)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默辨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值