Comment Jersey-client et le Client HTTP Apache se comparent-ils?

tout d'abord, je n'essaie pas de déclencher une guerre de mots ici. Je connais assez bien Jersey, mais j'ai à peine utilisé httpclient.

quelles sont les principales différences entre jersey-client et HttpClient D'Apache? Dans quels domaines l'un est-il meilleur que l'autre? Est-il un bon tableau de comparaison quelque part? Lequel fonctionne le mieux avec des fichiers plus grands (disons 2048 Mo)?

merci Beaucoup pour vos commentaires!

43
demandé sur carlspring 2013-09-02 13:49:14

1 réponses

Ces deux choses ne devraient probablement pas être comparées directement. Jersey est un REST-client, avec une implémentation complète de JAX-RS, une API fluide et une pile de filtres puissante. Le Client Http Apache est un client HTTP, parfait pour gérer les détails de bas niveau comme les temps morts, les routes de proxy complexes et les sondages de connexion. Ils agissent sur différents niveaux de votre pile de protocoles. Quand vous utilisez Jersey, Il y a toujours une sorte de client HTTP impliqué. Pas donné le backend explicitement, Maillot utilisera HttpUrlConnection comme backend par défaut.

Maillot avec HttpUrlConnection backend exemple:

Client client = Client.create();
WebResource webResource = client.resource("http://localhost:8080/path");
ClientResponse response = webResource.accept("application/json")
                                     .get(ClientResponse.class);

Maillot avec un Client Http Apache backend exemple:

HttpClient apacheClient = HttpClientBuilder.create().build();
Client client = new Client(new ApacheHttpClient4Handler(apacheClient,
                                                        new BasicCookieStore(),
                                                        true));
WebResource webResource = client.resource("http://localhost:8080/path");
ClientResponse response = webResource.accept("application/json")
                                     .get(ClientResponse.class);

veuillez noter l'utilisation du Handler dans le dernier exemple. Il s'agit d'une abstraction d'intégration clé pour Jersey d'intégrer et d'utiliser divers backends. Premier exemple utilise URLConnectionClientHandler profondeur sous le capot.

en ce qui concerne les performances et les fonctionnalités, il est peu logique de comparer Apache Http Client avec Jersey. On peut vouloir comparer différents Jersey backends ici, comme Jersey lui-même est simplement une API d'emballage. J'aimerais mettre en évidence quelques différences clés entre HttpUrlConnection et le Client Http Apache en me basant sur ma propre expérience:

HttpUrlConnection

  • aucune dépendance externe n'est nécessaire. Cela peut être très utile sur les plateformes embarquées ou mobiles.
  • Extrêmement bien documenté partout
  • A API mal conçue.
  • de nombreuses fonctionnalités sont configurées par l'intermédiaire des propriétés JVM, dont certaines peuvent ne pas être reconfigurables pendant l'exécution.
  • dans certains cas, il est impossible de gérer les temps morts. Vous pouvez finir par configurer 10 propriétés JVM différentes pour des temps morts différents et vos connexions peuvent toujours être suspendues dans certaines circonstances.
  • puisque le pain D'épice est un recommandé http API client pour Android.

Client Http Apache

  • pour 3.X versions sa performance était quelque peu similaire à HttpUrlConnection. La Version 4.1 contient beaucoup d'améliorations de la performance et fonctionne bien mieux que son homologue
  • assez bon pour gérer les temps morts de connexion et de lecture de données
  • C'est la conception suit Principe Ouvert / Fermé, de sorte que vous pouvez personnaliser presque n'importe quelle partie du traitement HTTP avec votre propre implémentation. Exemples: stratégies de redirection, stratégies de retry, stockage de cookies personnalisés, intercepteurs de requêtes/réponses, etc.
  • fournit un support de mandataire riche avec des constructeurs de route personnalisables pour les chemins multy-proxy complexes
  • A la sortie de la boîte par l'itinéraire le pool de connexion. Cela peut donner un bon avantage de performance si SSL/TLS est utilisé, en particulier avec les tokens PKCS#11 du matériel impliqués.
  • Fonctionnalités de journalisation détaillée

gardez à l'esprit, qu'il est également possible d'utiliser D'autres backends (par exemple pour les clients non bloquants) avec Jersey Si vous avez un com.sun.jersey.api.client.ClientHandler mise en œuvre.

75
répondu Jk1 2015-02-09 13:39:01