2

当我通过 Jersey ReST 客户端发送 POST 请求时,它会自动使用Header transfer-encoding: [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));
4

1 回答 1

2

HTTP 1.1 版本以后的分块传输编码是 POST 的默认值,在此数据中作为块发送,因此发送者可以在知道内容的总大小之前开始传输动态生成的内容。每个块的大小在块本身之前发送,以便接收者可以知道它何时完成接收该块的数据。数据传输由长度为零的最终块终止。

有没有办法强制使用 content-length: 而不是 transfer-encoding

在发送 POST 请求之前设置 Content-Length 标头。但这仅适用于 http 1.0,并且当您设置内容长度时,如果发布请求数据大小大于内容长度,则接收到的数据将被截断。

在 HTTP 协议的 1.1 版本中,分块传输机制被认为始终是可接受的,即使未在 TE(传输编码)请求头字段中列出,并且当与其他传输机制一起使用时,应始终最后应用传输的数据,并且不超过一次。来源维基百科 -分块传输编码


而在响应中,我们可以通过使用 response.setBufferSize() 设置响应上的 BufferSize 来避免传输编码。但是,如果我们的响应大小超出了 bufferSize,它将回退到 Transfer-Encoding: Chunked。


不同的传输机制

更多信息:

Content-Length 标头与分块编码

删除 POST 请求中的 Transfer-Encoding:chunked?

避免 HTTP/1.1 响应的分块编码

希望能帮助到你!

于 2016-07-06T07:20:43.310 回答