当我通过Jersey ReST客户端发送POST请求时,它会自动使用标头传输编码:[chunked] 。
有没有办法强制使用内容长度而不是传输编码。?
WebTarget webTarget = client.target(connection.getServerUrl());
Invocation.Builder builder = webTarget.request(MediaType.APPLICATION_XML);
Response response = builder.post(Entity.xml(requestBroker));
添加Content-Length属性后,行为也相同
WebTarget webTarget = client.target(connection.getServerUrl());
Invocation.Builder builder = webTarget.request(MediaType.APPLICATION_XML);
Entity entity = Entity.xml(requestBroker);
client.property("Content-Length", entity.toString().getBytes().length);
Response response = builder.post(Entity.xml(requestBroker));
答案 0 :(得分:2)
HTTP 1.1版本以后分块传输编码是POST的默认值,在此数据中作为块发送,因此发送者可以在知道该内容的总大小之前开始传输动态生成的内容。每个块的大小在块本身之前发送,以便接收器可以告知它何时完成接收该块的数据。数据传输由长度为零的最后一个块终止。
有没有办法强制使用内容长度:而不是 传输编码
在发送POST请求之前设置Content-Length标头。但这仅适用于http 1.0,当您设置内容长度时,如果发布请求数据大小超过内容长度,则收到的数据将被截断。
在HTTP协议的1.1版本中,分块传输机制被认为始终并且无论如何都是可接受的,即使未在TE(传输编码)请求头字段中列出,并且在使用时与其他传输机制一起,应始终最终应用于传输的数据,并且永远不会超过一次。来源维基百科 - Chunked Transfer Encoding
在响应中,我们可以通过使用response.setBufferSize()设置BufferSize on response来避免Transfer-Encoding。但是如果我们的响应大小超出bufferSize,它将回退到Transfer-Encoding:Chunked。
更多信息:
Content-Length header versus chunked encoding
Remove Transfer-Encoding:chunked in the POST request?
avoiding chunked encoding of HTTP/1.1 response
希望它有帮助!