Solución:
los RestTemplate
es un objeto muy versátil.
Empecemos con execute
, ya que es el método más genérico:
execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback,
@Nullable ResponseExtractor<T> responseExtractor, Object... uriVariables)
Nota la uriVariables
se puede pasar como un Map
también.
execute
está diseñado para ser aplicable en la mayor variedad de escenarios posible:
- El primer y segundo parámetros permiten cualquier combinación válida de URL y método.
- La solicitud se puede modificar de muchas formas diferentes pasando una
RequestCallback
(a@FunctionalInterface
con un solo métododoWithRequest(ClientHttpRequest request)
) antes de enviarlo. - La respuesta devuelta desde el recurso remoto se puede deserializar de cualquier forma necesaria pasando una
ResponseExtractor
.
Compare esto con exchange
:
exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity,
Class<T> responseType, Object... uriVariables)
Aquí hay dos diferencias importantes:
- Ahora puede pasar un
HttpEntity
directamente, mientras que antes era necesario configurarlo manualmente utilizando elRequestCallback
. - La mecánica de deserialización se proporciona de forma inmediata al pasar el tipo de respuesta deseado
Class
.
Como puede ver, esto es mucho más conveniente para el uso diario.
Métodos como getForEntity
y postForEntity
son versiones aún más breves y fáciles de entender de esto:
getForEntity(String url, Class<T> responseType, Object... uriVariables)
postForEntity(String url, @Nullable Object request, Class<T> responseType,
Object... uriVariables)
Aviso postForEntity
ahora le permite PUBLICAR cualquier Object
directamente sin envoltorio. No hay ningún beneficio o detrimento en el rendimiento al usarlos en lugar de execute
, como ellos llaman execute
ellos mismos bajo el capó, es simplemente una cuestión de conveniencia.
RestTemplate
es un sincrónico cliente para realizar solicitudes HTTP. Ofrece plantillas para escenarios comunes para cada método HTTP, además del generalizado exchange(...)
y execute(...)
métodos que apoyan casos menos frecuentes.
La documentación de Spring Integration resume el uso de cada método:
postForEntity
Crea un nuevo recurso a través de
POST
y devolver la representación de la respuesta.
exchange
Versión más generalizada y menos obstinada de los métodos anteriores que proporciona flexibilidad adicional cuando es necesario. Acepta
RequestEntity
, incluido el método HTTP, la URL, los encabezados y el cuerpo como entrada, y devuelve unResponseEntity
.Estos métodos permiten el uso de
ParameterizedTypeReference
en lugar deClass
para especificar un tipo de respuesta con genéricos.
execute
La forma más generalizada de realizar una solicitud, con control total sobre la preparación de la solicitud y la extracción de respuesta a través de interfaces de devolución de llamada.
Al final, ambos postForEntity(...)
, exchange(...)
y execute(...)
Los métodos invocarán el protegido doExecute(...)
método, que realizará la solicitud HTTP real. Puede consultar el código fuente para obtener más detalles