Des Alternatives à Apache HttpComponents?
Donc, je suis venu à la conclusion que Apache HttpComponents 4 est l'un des plus tendus Api que j'ai jamais rencontré. Les choses qui semblent comme ils doivent être simples prennent des centaines de lignes de code (et je suis encore pas sûr des ressources nettoyé correctement).
Plus il veut me faire faire 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);
Qui,... non. Je sais que c'est de Java, et nous ne sommes pas dans l'ensemble de la brièveté chose, mais c'est un peu trop. Pour ne pas mentionner les pots jusqu'à 700KB.
De toute façon, assez délires, j'ai voulu voir ce genre d'expériences que les gens ont avec les autres client HTTP bibliothèques?
Ceux que je connais sont: Jetty, hotpotato, et AsyncHttpClient.
C'est pour une utilisation côté serveur, je suis surtout intéressé à la performance pour de nombreuses concurrentes obtient et les transferts de fichiers volumineux.
Toutes les 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.
Mise à jour
@oleg: c'est ce que les docs 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 lors de la consommation de l'entité de contenu lors de l'utilisation de ThreadSafeClientConnManager
. Je suis sûr que c'est de ma faute, mais à ce point je n'ai pas vraiment envie d'avoir à le comprendre.
Hé, je ne veux pas dénigrer quiconque de travailler ici, mais j'ai été faire un effort de bonne foi pour utiliser HttpComponents depuis la 4.0 est sorti et il n'est tout simplement pas de travail pour moi.
- Bien que pas parfait, avez-vous considéré comme la norme URLConnection/HTTPUrlConnection ?
- D'avoir à appeler InputStream#close() pour libérer les ressources allouées est massivement plus complexe, n'est-ce pas?
- J'aimerais vraiment entendre ce que vous avez découvert depuis ce détachement. Je suis dans le même bateau 🙂
- Ajout d'un commentaire, depuis la Jetée client http lien mentionné ci-dessus est tellement vieux, ici, est le client docs. eclipse.org/jetty/documentation/current/http-client.html
- Depuis la version 4.0, l'API a changé avec chaque point de presse pour plus de fois que je l'ai changé mes sous-vêtements
- Je ne vous connais pas, donc je ne peux pas dire si les changements de l'API rapide, ou si je dois éviter l'odeur de votre maison 😀
- Un peu de la colonne A, un peu à partir de la colonne B
Vous devez vous connecter pour publier un commentaire.
Complexité de HttpClient API reflète simplement la complexité de son du domaine du problème. Contrairement à une fausse idée populaire que HTTP est assez complexe de protocole. Faible niveau de la bibliothèque de transport HC 4.0 API a été principalement optimisé pour les performances et la souplesse plutôt que la simplicité. Il est regrettable que vous n'êtes pas en mesure de le comprendre, mais ainsi soit-il. Vous êtes invités à utiliser quelle que soit la bibliothèque qui convient le mieux à vos besoins. Personnellement, j'aime Jetée HttpClient beaucoup. C'est une excellente alternative qui pourrait fonctionner mieux pour vous.
public static InputStream httpGetAsStream(String baseUrl, Map<String, Object> parameters)
Pour des cas d'utilisation simples que vous pouvez utiliser HttpClient API Fluent. Voir tutoriels.
Artefact Maven.
Pour répondre à ma propre question car c'est ressuscité pour une raison quelconque.
J'ai fini par écrire quelques simples wrappers autour de
java.net.HttpURLConnection
, semble qu'il est venu un long chemin depuis la dernière fois que j'ai sérieusement songé à elle.Apache HttpComponents est grand, mais peut-être exagéré pour des tâches simples. Aussi, au moins dans mon scénario, HUC est sensiblement plus rapide (pour la plupart mono-thread, n'avez pas fait de test sous charge lourde).
Google Client HTTP
Une autre bibliothèque est Google HTTP Bibliothèque Client Java.
Vous pouvez utiliser Netty ou Apache Mina mais ils sont très bas niveau, et je ne suis pas sûr que vous allez vous retrouver avec moins verbeux code.
jsoup
jsoup est une bibliothèque conçue pour analyser des fichiers HTML. Elle permet de faire appel HTTP pour récupérer le code source d'une page web.
Je suis un fan de l'API du client de JAX-RS (normalisé en 2.0) et Jersey de mise en œuvre en particulier. Il prend en charge async et a connecteurs de sorte qu'il peut être soutenue par Apache HttpComponents, plaine HttpUrlConnection, Jetée ou un Grizzly.
Il y a quelques bons exemples de l'utilisation de la ici, y compris les suivantes.
HTTPUnit a une excellente interface (pas la quantité de code nécessaire), mais la dernière version de il soumet les demandes de duplicata.
Interface htmlunit de travail, mais pour moi, il a semblé avoir limité la prise en charge de Javascript. J'ai
été en mesure de l'utiliser pour la base de pages web bien.
Vous pourriez avoir un coup d'oeil à Restlet's les fonctionnalités du client. C'est une couche au-dessus qui peut être pris en charge par Apache HttpComponents ou Java Net de l'API par exemple.