Quelle est la différence entre CloseableHttpClient et dans Apache HttpClient HttpClient API?
Je suis étudiant une application développée par notre société. Il utilise Apache HttpClient de la bibliothèque. Dans le code source, il utilise le HttpClient
classe pour créer des instances pour se connecter à un serveur.
Je veux apprendre Apache HttpClient et je suis allé creux cet ensemble d'exemples. Tous les exemples utilisent CloseableHttpClient
au lieu de HttpClient
. Donc, je pense que CloseableHttpClient
est une version étendue de HttpClient
. Si c'est le cas, j'ai deux questions:
- Quelle est la différence entre ces deux?
- La classe est recommandé d'utiliser pour mon nouveau développement?
- La documentation semble assez clair pour moi: "la Base de la mise en œuvre de HttpClient qui implémente également Fermer" - HttpClient est une interface; CloseableHttpClient est une classe abstraite, mais parce qu'il met en œuvre AutoCloseable vous pouvez utiliser dans un try-with-resources déclaration.
- C'est évident, mais comment est-il important pour fermer
HttpClient
instances? Si c'est important, pourquoi leclose()
méthode ne fait pas partie de l'interface de base? - J'ai peur de ne pas en savoir assez sur HttpClient pour répondre à ça 🙁
Vous devez vous connecter pour publier un commentaire.
Voici un exemple de processus de l'exécution de la demande dans sa forme la plus simple:
HttpClient la désallocation de la ressource: Lorsqu'une instance CloseableHttpClient est plus nécessaire et il est sur le point de sortir de la portée le gestionnaire de connexion associés doivent être fermées par l'appel de la CloseableHttpClient#méthode close ().
voir le Référence pour apprendre les fondamentaux.
@Scadge
Depuis Java 7, l'Utilisation de try-with-resources instruction s'assure que chaque ressource est fermée à la fin de l'instruction.
httpget
aussiEu la même question. Les autres réponses ne semblent pas répondre à pourquoi close() est-elle vraiment nécessaire? Également, Op semblait avoir du mal à comprendre la meilleure façon de travailler avec HttpClient, et al.
Selon Apache:
En outre, les relations vont comme suit:
Le mode préféré selon Apache:
L'exemple ils donnent ne
httpclient.close()
dans lefinally
clause, et permet également l'utilisation deResponseHandler
ainsi.Comme une alternative, la façon mkyong le fait, c'est un peu intéressant, ainsi:
Il ne montre pas une
client.close()
appeler, mais je pense que c'est nécessaire, carclient
est toujours une instance deCloseableHttpClient
.Les autres réponses ne semblent pas répondre à pourquoi
close()
est-elle vraiment nécessaire? * 2Doute sur la réponse "HttpClient ressources de libération de la mémoire".
Il est mentionné dans le vieux-3.x httpcomponents doc, ce qui est long et possède beaucoup de différence à partir de 4.x HC. Par ailleurs, l'explication est si bref que ne disent pas ce que cette ressource sous-jacente est.
J'ai fait quelques recherches sur 4.5.2 libérer le code source, trouvé les implémentations de
CloseableHttpClient:close()
fondamentalement ne ferme son gestionnaire de connexion.(Pour info) C'est pourquoi, lorsque vous partagez un
PoolingClientConnectionManager
et appel clientclose()
, exceptionjava.lang.IllegalStateException: Connection pool shut down
va se produire. Pour éviter,setConnectionManagerShared
œuvres.Je préfère pas ne
CloseableHttpClient:close()
après chaque requête uniqueJ'ai utilisé pour créer un nouveau client http instance lorsque vous faites la demande et enfin la fermer. Dans ce cas, il vaut mieux ne pas appeler
close()
. Depuis, si le gestionnaire de connexion n'a pas "partagé" drapeau, il sera à l'arrêt, ce qui est trop cher pour une seule requête.En fait, j'ai aussi trouvé dans la bibliothèque de clj-http, un Clojure wrapper sur Apache SC 4.5, à ne pas faire appel
close()
à tous. Voir funcrequest
dans le fichier de base.cljDans la prochaine version majeure de la bibliothèque
HttpClient
interface va étendreCloseable
. Jusqu'alors, il est recommandé d'utiliserCloseableHttpClient
si la compatibilité avec les anciennes 4.versions x (4.0, 4.1 et 4.2) n'est pas nécessaire.HttpClient
n'est pas une classe, c'est une interface. Vous ne pouvez pas l'utiliser pour le développement de la façon que tu veux dire.Ce que vous voulez, c'est une classe qui implémente l'
HttpClient
de l'interface, et c'estCloseableHttpClient
.CloseableHttpClient
est la classe de base de la httpclient de la bibliothèque, celui que toutes les implémentations de l'utiliser. Les autres sous-classes sont pour la plupart obsolètes.La
HttpClient
est une interface de cette classe et les autres classes.Vous devez alors utiliser le
CloseableHttpClient
dans votre code, et de la créer à l'aide de laHttpClientBuilder
. Si vous avez besoin d'envelopper le client pour ajouter un comportement spécifique, vous devez utiliser la requête et la réponse intercepteurs à la place de l'emballage avec leHttpClient
.Cette réponse a été donnée dans le cadre de httpclient-4.3.