Ottenere Dimensioni di risposta HTTP in Java
-
16-09-2019 - |
Domanda
Mi piacerebbe sapere quanti dati è stato inviato in risposta ad una certa http-request. Quello che attualmente faccio è questa:
HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();
// controlla la risposta per il contenuto-size int feedsize = con.getContentLength ();
Il problema è, che il contenuto-legnth non è sempre impostato. Per esempio. quando il server utilizza transfer-encoding = chunked torno un valore di -1.
Lo faccio non bisogno di questo per visualizzare le informazioni di avanzamento. Ho solo bisogno di conoscere la dimensione dei dati che mi è stata inviata dopo che è stato fatto.
Sfondo:. Ho bisogno di queste informazioni perché vorrei confrontarlo con le dimensioni di una risposta, che è stato inviato utilizzando la codifica gzip
Soluzione
mi piacerebbe utilizzare un commons-io CountingInputStream , che fare il lavoro per voi. Un esempio completo ma banale:
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);
}
}
Altri suggerimenti
È possibile estendere FilterInputStream
, ignorando le read()
, read(byte[],int,int)
e metodi skip
in modo che dopo aver chiamato la forma super
, aggiornano un contatore con il numero di byte letti.
Poi avvolgere il flusso di input restituito da URLConnection
con uno di questi, e utilizzare l'involucro al posto del flusso originale. Quando hai finito, è possibile interrogare di involucro suo contatore.
Altro ( "manuale") si avvicina sarebbe utilizzare uno strumento come YSlow per raccogliere le statistiche in un browser, o Wireshark per esaminare il traffico sulla rete.