RestTemplate: exchange() vs postForEntity() vs execute()

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 @FunctionalInterface with just one method doWithRequest(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 HttpEntity directly, whereas before it needed to be set manually using the RequestCallback.
  • 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.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)