Je travaille sur Rest API en utilisant Spring Boot et je devais accéder au point de terminaison d'une application. J'ai utilisé RestTemplate
pour cela. J'ai été capable de le faire en utilisant 2 méthodes,
postForEntity()
:
responseEntity =
restTemplate.postForEntity(uri, httpEntity, ResponseClass.class);
exchange()
:
responseEntity =
restTemplate.exchange(uri, HttpMethod.POST, httpEntity, ResponseClass.class);
J'aimerais connaître l'usage et les différences de ces deux méthodes.
Je vois aussi une autre méthode execute()
. S'il vous plaît faire la lumière sur elle. Comment et quand l'utiliser.
Le RestTemplate
est un objet très polyvalent.
Commençons par execute
, puisqu'il s'agit de la méthode la plus générique:
execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback,
@Nullable ResponseExtractor<T> responseExtractor, Object... uriVariables)
Notez que uriVariables
peut également être passé en tant que Map
.
execute
est conçu pour être applicable dans la plus grande variété de scénarios possible:
RequestCallback
personnalisé (un @FunctionalInterface
Avec une seule méthode doWithRequest(ClientHttpRequest request)
) avant de l'envoyer.ResponseExtractor
personnalisé.Comparez ceci avec exchange
:
exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity,
Class<T> responseType, Object... uriVariables)
Il y a deux différences majeures ici:
HttpEntity
directement, alors qu'avant, il devait être défini manuellement à l'aide de RequestCallback
.Class
.Comme vous pouvez le constater, cela est beaucoup plus pratique pour une utilisation quotidienne.
Des méthodes telles que getForEntity
et postForEntity
sont encore plus courtes et plus faciles à comprendre:
getForEntity(String url, Class<T> responseType, Object... uriVariables)
postForEntity(String url, @Nullable Object request, Class<T> responseType,
Object... uriVariables)
Avis postForEntity
vous permet maintenant de POST toute Object
directement sans encapsuleur. Il n'y a aucun avantage en termes de performances ni aucun inconvénient à les utiliser au lieu de execute
, comme ils s'appellent execute
eux-mêmes sous le capot - c'est simplement une question de commodité.
RestTemplate
est un client synchrone pour exécuter des requêtes HTTP. Il propose des modèles pour des scénarios courants pour chaque méthode HTTP, en plus des méthodes généralisées exchange(...)
et execute(...)
qui prennent en charge les cas moins fréquents.
La documentation d'intégration Spring résume l'utilisation de chaque méthode:
postForEntity
Créez une nouvelle ressource via
POST
et renvoyez la représentation à partir de la réponse.
exchange
Version plus généralisée et moins éclairée des méthodes ci-dessus, offrant une flexibilité supplémentaire en cas de besoin. Il accepte
RequestEntity
, y compris la méthode HTTP, l'URL, les en-têtes et le corps, et renvoie unResponseEntity
.Ces méthodes permettent d'utiliser
ParameterizedTypeReference
à la place deClass
pour spécifier un type de réponse avec des génériques.
execute
La manière la plus générale de traiter une requête, avec un contrôle total sur la préparation de la requête et l'extraction de la réponse via des interfaces de rappel.
Finalement, les deux méthodes postForEntity(...)
, exchange(...)
et execute(...)
invoqueront la méthode protégée doExecute(...)
, qui effectuera la requête HTTP réelle. Vous pouvez vérifier le code source pour plus de détails
Si vous regardez l’implémentation de postForEntity et de la méthode d’échange, vous verrez qu’elles utilisent toutes deux les méthodes execute à l’arrière. L'utilisation de la méthode d'échange vous donnera plus de liberté pour appeler différentes méthodes http.