Donc, je suis arrivé à la conclusion que Apache HttpComponents 4 est l'une des API les plus surmenées que j'ai jamais rencontrées. Les choses qui semblent simples devraient prendre des centaines de lignes de code (et je suis toujours pas sûr que les ressources soient nettoyées correctement).
De plus, il veut que je fasse des choses comme:
List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("q", "httpclient"));
qparams.add(new BasicNameValuePair("btnG", "Google Search"));
qparams.add(new BasicNameValuePair("aq", "f"));
qparams.add(new BasicNameValuePair("oq", null));
URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search",
URLEncodedUtils.format(qparams, "UTF-8"), null);
Ce qui, juste ... non. Je sais que c'est Java, et nous ne sommes pas dans toute la brièveté, mais c'est un peu trop. Sans oublier que les bocaux sont jusqu'à 700 Ko.
Quoi qu'il en soit, assez déclamant, je voulais voir quel genre d'expériences les gens ont eu avec d'autres bibliothèques client HTTP?
Ceux que je connais sont: Jetty , hotpotato , et AsyncHttpClient .
Ceci est pour une utilisation côté serveur, je suis principalement intéressé par les performances de nombreux get simultanés et de gros transferts de fichiers.
Des recommandations?
PS Je sais que le vénérable HttpClient 3.1 est toujours là, mais j'aimerais utiliser quelque chose qui est pris en charge.
@oleg: voici ce que les doc suggèrent:
HttpClient httpclient = new DefaultHttpClient();
try {
HttpGet httpget = new HttpGet("http://www.Apache.org/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
try {
instream.read();
} catch (IOException ex) {
throw ex;
} catch (RuntimeException ex) {
httpget.abort();
throw ex;
} finally {
try { instream.close(); } catch (Exception ignore) {}
}
}
} finally {
httpclient.getConnectionManager().shutdown();
}
Je reçois toujours des erreurs inattendues lors de la consommation de contenu d'entité lors de l'utilisation de ThreadSafeClientConnManager
. Je suis sûr que c'est ma faute, mais à ce stade, je ne veux pas vraiment avoir à le comprendre.
Hé, je ne veux dénigrer le travail de personne ici, mais je fais un effort de bonne foi pour utiliser HttpComponents depuis la sortie de la 4.0 et cela ne fonctionne tout simplement pas pour moi.
Répondre à ma propre question depuis que cela est ressuscité pour une raison quelconque.
J'ai fini par écrire quelques emballages simples autour Java.net.HttpURLConnection
, il semble que ce soit un long chemin depuis la dernière fois que je l'ai sérieusement envisagé.
Apache HttpComponents est génial, mais peut être excessif pour des tâches simples. En outre, au moins dans mon scénario, HUC est sensiblement plus rapide (principalement monotrame, n'a effectué aucun test sous une charge élevée).
La complexité de l'API HttpClient reflète simplement la complexité de son domaine problématique. Contrairement à une idée fausse très répandue, HTTP est un protocole assez complexe. Étant une bibliothèque de transport de bas niveau, l'API HC 4.0 a été principalement optimisée pour les performances et la flexibilité plutôt que pour la simplicité. Il est regrettable que vous ne puissiez pas le comprendre, mais qu'il en soit ainsi. Vous êtes invités à utiliser la bibliothèque qui convient le mieux à vos besoins. Personnellement, j'aime beaucoup Jetty HttpClient . C'est une excellente alternative qui pourrait mieux fonctionner pour vous.
Pour les cas d'utilisation simples, vous pouvez utiliser HttpClient Fluent API . Voir tutoriels .
Ce module fournit une API de façade facile à utiliser pour HttpClient basée sur le concept d'une interface fluide. L'API Fluent facade expose uniquement les fonctions les plus fondamentales de HttpClient et est conçue pour les cas d'utilisation simples qui ne nécessitent pas la flexibilité totale de HttpClient. Par exemple, une API de façade fluide évite aux utilisateurs d'avoir à gérer la connexion et la répartition des ressources
// Execute a GET with timeout settings and return response content as String.
Request.Get("http://somehost/")
.connectTimeout(1000)
.socketTimeout(1000)
.execute().returnContent().asString();
Artefact Maven.
<dependency>
<groupId>org.Apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
<version>4.2.5</version>
</dependency>
Une autre bibliothèque est Google HTTP Client Library for Java .
Écrit par Google, cette bibliothèque est une bibliothèque cliente flexible, efficace et puissante Java pour accéder à n'importe quelle ressource sur le Web via HTTP. Elle comporte une abstraction de transport HTTP enfichable qui permet à n'importe quelle bibliothèque de bas niveau à utiliser, comme Java.net.HttpURLConnection, Apache HTTP Client ou URL Fetch sur Google App Engine. Il propose également des modèles de données JSON et XML efficaces pour l'analyse et la sérialisation du contenu des réponses et des requêtes HTTP. Les bibliothèques JSON et XML sont également entièrement enfichable, y compris la prise en charge des bibliothèques GSON Jackson et Android pour JSON.
Je suis un fan de l'API client de JAX-RS (normalisé en 2.0) et de l'implémentation de Jersey en particulier. Il prend en charge async et a connecteurs afin qu'il puisse être soutenu par Apache HttpComponents, plain HttpUrlConnection, Jetty ou Grizzly.
Il existe de bons exemples d'utilisation ici , y compris les suivants.
client.target(REST_SERVICE_URL)
.path("/{bookId}")
.resolveTemplate("bookId", bookId)
.request()
.get(Book.class);
Vous pouvez utiliser Netty ou Apache Mina bien qu'ils soient de très bas niveau et je ne suis pas sûr que vous vous retrouverez avec du code moins bavard.
jsoup est une bibliothèque conçue pour analyser des fichiers HTML. Il effectue des appels HTTP pour récupérer le code source d'une page Web.
Document doc = Jsoup.connect("http://en.wikipedia.org/").get();
HTTPUnit a une excellente interface (pas beaucoup de code nécessaire), mais la dernière version de celui-ci soumet des demandes en double.
HTMLUnit fonctionnera, mais pour moi, il semble que le support de Javascript soit limité. J'ai cependant pu l'utiliser pour les pages Web de base.
Vous pouvez jeter un œil aux capacités client de Restlet . C'est une couche au-dessus qui peut être prise en charge par Apache HttpComponents ou Java's Net API par exemple.