Taille de la réponse Obtenez HTTP en Java
-
16-09-2019 - |
Question
Je voudrais savoir combien de données a été envoyé en réponse à une certaine http demande. Ce que je fais actuellement est la suivante:
HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();
// vérifier la réponse de la taille du contenu int feedsize = con.getContentLength ();
Le problème est que-legnth de contenu est pas toujours définie. Par exemple. lorsque le serveur utilise transfert encoding = chunked Je reviens une valeur de -1.
Je fais pas besoin de ceci pour afficher des informations de progression. J'ai juste besoin de connaître la taille des données qui m'a été envoyé après qu'il a été fait.
Arrière-plan. Je besoin de cette information parce que je voudrais comparer à la taille d'une réponse, qui a été envoyé en utilisant l'encodage gzip
La solution
J'utiliser un , ce qui ferait le travail pour vous. Un exemple complet mais trivial:
public long countContent(URL feedurl) {
CountingInputStream counter = null;
try {
HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();
counter = new CountingInputStream(con.getInputStream());
String output = IOUtils.toString(counter);
return counter.getByteCount();
} catch (IOException ex) {
throw new RuntimeException(ex);
} finally {
IOUtils.closeQuietly(counter);
}
}
Autres conseils
Vous pouvez étendre FilterInputStream
, outrepassant les read()
, read(byte[],int,int)
et méthodes de skip
de sorte que après avoir appelé le formulaire de super
, ils mettent à jour un compteur avec le nombre d'octets lus.
Ensuite, enveloppez le flux d'entrée retourné par URLConnection
avec l'un de ceux-ci, et utiliser l'emballage en place du flux d'origine. Lorsque vous avez terminé, vous pouvez interroger son compteur de wrapper.
Autres ( « manuel ») approche serait d'utiliser un outil comme YSlow pour recueillir des statistiques dans un navigateur, ou Wireshark pour examiner le trafic sur le réseau.