I am using URL class to read an InputStream from it. Is there any way I can use RestTemplate for this?
InputStream input = new URL(url).openStream();
JsonReader reader = new JsonReader(new InputStreamReader(input, StandardCharsets.UTF_8.displayName()));
How can I get InputStream
with RestTemplate
instead of using URL
?
You should not get the InputStream
directly. RestTemplate
is meant to encapsulate processing the response (and request) content. Its strength is handling all the IO and handing you a ready-to-go Java object.
One of RestTemplate
's original authors, Brian Clozel, has stated:
RestTemplate
is not meant to stream the response body; its contract doesn't allow it, and it's been around for so long that changing such a basic part of its behavior cannot be done without disrupting many applications.
You'll need to register appropriate HttpMessageConverter
objects. Those will have access to the response's InputStream
, through an HttpInputMessage
object.
As Abdull suggests, Spring does come with an HttpMessageConverter
implementation for Resource
which itself wraps an InputStream
, ResourceHttpMessageConverter
. It doesn't support all Resource
types, but since you should be programming to interfaces anyway, you should just use the superinterface Resource
.
The current implementation (4.3.5), will return a ByteArrayResource
with the content of the response stream copied to a new ByteArrayInputStream
which you can access.
You don't have to close the stream. The RestTemplate
takes care of that for you. (This is unfortunate if you try to use a InputStreamResource
, another type supported by the ResourceHttpMessageConverter
, because it wraps the underlying response's InputStream
but is closed before it can be exposed to your client code.)