web-dev-qa-db-fra.com

Jersey REST client avec Apache HTTP Client 4.5 vs retrofit

Je lisais de nombreux articles pour trouver le meilleur client Rest pour Java, j'ai finalement trouvé que Jersey avec le client Apache HTTP 4.5 était génial mais dans beaucoup d'articles, j'ai trouvé que maintenant Retrofit est le meilleur (Je n'ai pas mentionné Volley parce que dans mon cas, je n'ai pas besoin que l'API prenne en charge la mise en cache.

Est-ce que Retrofit est meilleur pour une application cliente Java. Ou est-il juste meilleur pour Android? Et pourquoi je n'ai pas trouvé cette comparaison avant .. ils ne peuvent pas être comparés?

Puis-je avoir une comparaison entre leurs performances, le pool de connexions, sur quelle couche fonctionnent-ils, la compression des demandes et des réponses, le délai d'expiration, la dé-sérialisation?

HTTP3 ne prend pas en charge le regroupement de connexions, c'est pourquoi la mise à niveau est généralement utilisée pour Android ?? donc ce ne sera pas pratique pour une application Java Java où elle sera provoquer une fuite de connexion.

Mon objectif est de trouver le meilleur client API Rest avec des performances élevées et de prendre en charge un nombre élevé de connexions.

Merci d'avance

22
Chris Sim

Vous mélangez différentes choses ensemble. Pour clarifier les choses dès le départ:

Retrofit est une bibliothèque cliente pour interagir avec REST API. En tant que telle, elle offre le même niveau d'abstraction que Jersey , RESTeasy ou Spring's RestTemplate . Ils permettent tous d'interagir avec les API REST en utilisant une API de type sécurisé sans avoir à traiter des aspects de bas niveau comme la sérialisation, la création de requêtes et la gestion des réponses.

Chacune de ces bibliothèques utilise un client HTTP en dessous pour réellement parler à un serveur HTTP. Les exemples sont client HTTP Apache que vous avez mentionné, OkHttp ou la version ancienne HttpUrlConnection livrée avec le JDK.

Vous pouvez généralement mélanger et faire correspondre les différentes REST et clients HTTP à l'exception de Retrofit car Retrofit a une forte dépendance à OkHttp depuis la version 2 (avec Retrofit 1.x vous pouvez utiliser Apache HTTP Client, HttpUrlConnection ou OkHttp).

Retour à la question réelle: que choisir quand.

Android : C'est facile ici parce que JAX-RS , l'API/la technologie derrière Jersey et RESTeasy n'est pas prise en charge sur Android. Par conséquent, Retrofit est plus ou moins votre seule option, sauf peut-être Volley si vous ne voulez pas parler directement HTTP. Spring n'est pas disponible non plus et Spring Android est abandonné .

JRE/JDK : Ici, vous avez le choix complet des options.

  • La mise à niveau peut être intéressante si vous souhaitez une solution rapide et facile pour implémenter une API tierce pour laquelle aucun SDK n'est disponible ou des interfaces JAX-RS.
  • Le RestTemplate de Spring est un bon choix si vous utilisez Spring et qu'il n'y a pas d'interfaces JAX-RS ou si vous ne voulez pas acheter dans JAX-RS, c'est-à-dire aussi l'utiliser du côté serveur.
  • JAX-RS (Jersey, RESTeasy,…) est un bon choix si vous souhaitez partager des définitions d'interface entre le client et les serveurs ou si vous êtes tout de même sur JavaEE.

En ce qui concerne les performances: les principaux pilotes ici sont le temps consacré à la HTTP et à la (dé) sérialisation. Parce que la (dé) sérialisation est effectuée par des bibliothèques spécialisées comme Jackson ou protobuf et utilisent toutes la même chose (ou vous pourriez au moins les faire), il ne devrait pas y avoir de différence significative.

31
aha

Il a fallu un certain temps pour trouver, mais j'ai trouvé la bibliothèque cliente REST parfaite qui rend notre développement déclaratif et facile. Nous pouvons l'utiliser comme standard lors du développement de nouveaux REST implémentations ou API.

Il s'appelle Feign, développé par l'équipe Netflix et conçu pour fonctionner avec Spring Cloud Netflix. Plus de détails ici sur le site du projet.

Certaines fonctionnalités incluent: - Intégration avec Jackson, Gson et d'autres encodeurs/décodeurs - Utilisation d'OkHttp pour la communication réseau, une bibliothèque HTTP éprouvée - Liaison avec SLF4J pour les fonctionnalités de journalisation - Implémentation basée sur une interface, développement minimal. Voici un exemple de client:

@FeignClient("stores")
public interface StoreClient
{
   @RequestMapping(method = RequestMethod.GET, value = "/stores")
   List<Store> getStores();

   @RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json")
   Store update(@PathVariable("storeId") Long storeId, Store store);
}

Et après la réponse de @aha citée ci-dessous:

JRE/JDK: Ici, vous avez le choix complet des options.

La mise à niveau peut être intéressante si vous souhaitez une solution rapide et facile pour implémenter une API tierce pour laquelle aucun SDK n'est disponible ou des interfaces JAX-RS.

Le RestTemplate de Spring est un bon choix si vous utilisez Spring et qu'il n'y a pas d'interfaces JAX-RS ou si vous ne voulez pas acheter dans JAX-RS, c'est-à-dire aussi l'utiliser du côté serveur.

JAX-RS (Jersey, RESTeasy,…) est un bon choix si vous souhaitez partager des définitions d'interface entre le client et les serveurs ou si vous êtes tout de même sur JavaEE.

Feign fonctionne comme retrofit et JAX-RS ensemble: solution facile et peut partager les définitions d'interface entre le client et les serveurs et peut utiliser les interfaces JAX-RS

4
Chris Sim