REST – Use StreamingOut to return big content in chunk


Stream a file back

There are times REST server needs to return large content back to client. To avoid to load the full content in memory before returning it back as a whole, you can create a stream object from anonymous class against the JAX RS interface StreamingOut and then register it to Response instance. After that, server will callback the StreamingOut’s write method with the server OutputStream passed in. With the handle of the OutputStream, you can then write content in chunk to the output stream. See the code below that stream a big log file back to the client.

If you are writing a big list of string as response, you can also wrap the server OutputStream with OutputStreamWriter like below:

Behind the scene, the content is sent to the client in chunk with size 16kB as it makes use of the chunked transfer encoding with packet size 16kB. You can confirm this thru tcpdump.

Content-Length and Transfer Encoding

When an HTTP client is reading a response message from a server it needs to know when it has reached the end of the message. This is particularly important with persistent (keep alive) connections, because a connection can only be re-used by another HTTP transaction after the response message has been fully received. The following sections describe the four ways in which an HTTP server can indicate the end of the response message:

  1. Connection Closed by Server – The connection can be closed at the end of the response message by the server, but this prevents connections being re-used.
  2. Content-Length Header – The length of the content after the response headers can be specified in bytes with the Content-Length header. You can do that if you know the full size of your response before sending it out.
  3. Implied Content Length – Some types of responses, such as 304, are defined to never have content and therefore the client can assume that the response message is terminated by the double CRLF after the headers.
  4. Chunked Encoding – The content can be broken up into a number of chunks; each of which is prefixed by its size in bytes. A zero size chunk indicates the end of the response message. If a server is using chunked encoding it must set the Transfer-Encoding header to “chunked”. Chunked encoding is useful when a large amount of data is being returned to the client and the total size of the response may not be known until the request has been fully processed. An example of this is generating an HTML table of results from a database query. If you wanted to use the Content-Length header you would have to buffer the whole result set before calculating the total content size. However, with chunked encoding you could just write the data one row at a time and write a zero sized chunk when the end of the query was reached.

Examples

Regular HTTP Response

HTTP Response using chunked transfer encoding

So What’s The Benefit Of Streaming?

Streaming doesn’t cut latency, neither it cuts the time a dynamic response needs to be generated. But since the application sends content right away instead of waiting for the whole response to be rendered, the client is able to request assets sooner. In particular, if you flush the head of an HTML document CSS and JavaScript files are going to be fetched in parallel, while the server works on generating content. The consequence is that pages load faster.


REST – Use StreamingOut to return big content in chunk

log in

Use demo/demo public access

reset password

Back to
log in
Choose A Format
Personality quiz
Trivia quiz
Poll
Story
List
Meme
Video
Audio
Image