49 votes

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 toujours pas sûr de ressources nettoyée correctement).

De 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: la Jetée, 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 d' ThreadSafeClientConnManager. Je suis sûr que c'est de ma faute, mais à ce point je n'ai pas vraiment envie d'avoir à le comprendre.

Hey, 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.

20voto

oleg Points 7016

La 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.

16voto

Vahe Harutyunyan Points 320

Pour des cas d'utilisation simples que vous pouvez utiliser HttpClient API Fluent. Voir les tutoriels.

Ce module fournit un facile à utiliser façade de l'API pour HttpClient basé sur le concept d'une interface fluide. Couramment façade de l'API expose que la plupart des fonctions fondamentales de HttpClient et est indended pour des cas d'utilisation simples qui ne nécessitent pas la flexibilité de HttpClient. Par exemple, couramment façade de l'API soulage les utilisateurs d'avoir à traiter avec la gestion de la connexion et la désallocation de la ressource

    // 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>

6voto

Dmitri Points 4199

Pour répondre à ma propre question car c'est ressuscité pour une raison quelconque.

J'ai fini par écrire quelques simples wrappers autour java.net.HttpURLConnection, il 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).

4voto

Basil Bourque Points 8938

Une autre bibliothèque est Google HTTP Bibliothèque Client Java.

Écrit par Google, cette bibliothèque est une solution flexible, efficace, et puissant client Java de la bibliothèque pour accéder à une ressource sur le web via le protocole HTTP. Il dispose d'un enfichables transport HTTP abstraction qui permet à une bibliothèque bas niveau pour être utilisés, tels que java.net.HttpURLConnection, Client HTTP Apache, ou l'URL de Chercher sur Google App Engine. Il dispose également efficace JSON et XML des modèles de données pour l'analyse et la sérialisation de la réponse HTTP et le contenu de demande. Le JSON et XML bibliothèques sont également entièrement enfichable, y compris le soutien pour Jackson et Android GSON bibliothèques JSON.

3voto

CarlosZ Points 2455

Vous pouvez utiliser Netty ou Apache Mina, même s’ils sont de niveau très bas et je ne suis pas sûr que vous obtiendrez du code moins verbeux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X