The RestTemplate is a very versatile object.
Let’s start with execute, since it’s the most generic method:
execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback,
@Nullable ResponseExtractor<T> responseExtractor, Object... uriVariables)
Note the uriVariables can be passed as a Map too.
execute is designed to be applicable in the highest variety of scenarios possible:
- The first and second parameters allow any valid combination of URL and method.
- The request can be modified in a myriad of different ways by passing a custom
RequestCallback(a@FunctionalInterfacewith just one methoddoWithRequest(ClientHttpRequest request)) before sending it. - The response returned from the remote resource can be deserialized in any way necessary by passing a custom
ResponseExtractor.
Compare this with exchange:
exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity,
Class<T> responseType, Object... uriVariables)
There are two major differences here:
- You can now pass an
HttpEntitydirectly, whereas before it needed to be set manually using theRequestCallback. - Deserialization mechanics are provided out of the box by passing the desired response type
Class.
As you can see, this is much more convenient for everyday use.
Methods like getForEntity and postForEntity are even shorter, easier to understand versions of this:
getForEntity(String url, Class<T> responseType, Object... uriVariables)
postForEntity(String url, @Nullable Object request, Class<T> responseType,
Object... uriVariables)
Notice postForEntity now allows you to POST any Object directly without a wrapper. There is no performance benefit or detriment to using these instead of execute, as they call execute themselves under the hood – it’s simply a matter of convenience.