How do i send a POST request without Transfer Enco

2019-07-18 21:29发布

问题:

When i send a POST request through Jersey ReST client it's automatically using Header transfer-encoding: [chunked].

Is there any way to force use of content-length: instead of transfer-encoding.?

  WebTarget webTarget = client.target(connection.getServerUrl());
  Invocation.Builder builder = webTarget.request(MediaType.APPLICATION_XML);
  Response response = builder.post(Entity.xml(requestBroker));

After adding Content-Length property too the behavior is same

  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));

回答1:

HTTP 1.1 version onwards chunked transfer encoding is default for POST, in this data is sent as chunks and hence the senders can begin transmitting dynamically-generated content before knowing the total size of that content. The size of each chunk is sent right before the chunk itself so that the receiver can tell when it has finished receiving data for that chunk. The data transfer is terminated by a final chunk of length zero.

Is there any way to force use of content-length: instead of transfer-encoding

Set the Content-Length header before sending your POST request. But this will work only in http 1.0, and when you set the content length, and if the post request data size is more than the content length then the data received will be truncated.

In the version 1.1 of the HTTP protocol, the chunked transfer mechanism is considered to be always and anyways acceptable, even if not listed in the TE (transfer encoding) request header field, and when used with other transfer mechanisms, should always be applied last to the transferred data and never more than one time. Source Wikipedia - Chunked Transfer Encoding


Whereas in the response, we can avoid Transfer-Encoding by setting the BufferSize on response using response.setBufferSize(). But if our response size goes beyond the bufferSize it would fallback to Transfer-Encoding: Chunked.


Different Transfer Mechanisms

More Info:

Content-Length header versus chunked encoding

Remove Transfer-Encoding:chunked in the POST request?

avoiding chunked encoding of HTTP/1.1 response

Hope it Helps!