Un peu confus au sujet de HttpClient[Java] manipulation gzip réponses
Mon application effectue une requête http à certaines api de service, le service renvoie un format de réponse. Comment puis-je m'assurer que la réponse est en effet dans gzip format? Je ne comprends pas pourquoi après avoir fait la demande, je n'ai pas à le décompresser.
Ci-dessous mon code:
public static String streamToString(InputStream stream) {
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
StringBuilder sb = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
} catch (IOException e) {
logger.error("Error while streaming to string: {}", e);
} finally {
try { stream.close(); } catch (IOException e) { }
}
return sb.toString();
}
public static String getResultFromHttpRequest(String url) throws IOException { //add retries, catch all exceptions
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpGet;
HttpResponse httpResponse;
InputStream stream;
try {
httpGet = new HttpGet(url);
httpGet.setHeader("Content-Encoding", "gzip, deflate");
httpResponse = httpclient.execute(httpGet);
logger.info(httpResponse.getEntity().getContentEncoding());
logger.info(httpResponse.getEntity().getContent());
if (httpResponse.getStatusLine().getStatusCode() == 200) {
stream = httpResponse.getEntity().getContent();
return streamToString(stream);
}
} catch (IllegalStateException e) {
logger.error("Error while trying to access: " + url, e);
}
return "";
}
Peut-être qu'il se décompresse automatiquement, mais je voudrais voir quelques signes de cette à moins.
double possible de Apache Commons HttpClient soutien GZIP?
un peu, mais pas exactement.
Si l'environnement le permet, un très vérification rapide pourrait avoir été la capture de trafic (Wireshark, Tcpdump...) entre l'application et le serveur. Que HTTP est un texte basé sur le protocole, si la réponse a le droit d'en-tête et le corps est composé principalement de la non-caractères lisibles, il semble que la réponse est compressé.
un peu, mais pas exactement.
Si l'environnement le permet, un très vérification rapide pourrait avoir été la capture de trafic (Wireshark, Tcpdump...) entre l'application et le serveur. Que HTTP est un texte basé sur le protocole, si la réponse a le droit d'en-tête et le corps est composé principalement de la non-caractères lisibles, il semble que la réponse est compressé.
OriginalL'auteur iCodeLikeImDrunk | 2014-01-31
Vous devez vous connecter pour publier un commentaire.
Salut, je suis en retard, mais cette réponse pourrait être utilisé qui est en face d'un même problème.
Par défaut, le contenu est décompressé dans la réponse. Donc, vous devez désactiver la compression par défaut à l'aide de code suivant:
OriginalL'auteur Prabhat Kumar
Je pense que vous voulez utiliser DecompressingHttpClient (ou la nouvelle HttpClientBuilder - ce qui ajoute que l'en-tête par défaut, ne l'appelez pas disableContentCompression - je ne pense pas que
DefaultHttpClient
prend en charge la compression par défaut). Le client doit envoyer un Accept-Encoding - tête Content-Encoding vient de la réponse du serveur.Elle change tellement souvent! J'ai ajouté le HttpClientBuilder, ce qui semble être la méthode plus moderne.
HttpClientBuilder n'est pas obsolète
je vais jeter un oeil à ce.
OriginalL'auteur Elliott Frisch
Vous pouvez savoir si oui ou non une entité nécessite de décompression par l'examen de ses
Content-Encoding
en-tête. Cet en-tête sera réécrit (ou supprimé) dans le cas où le contenu automatique de décompression.l'absence explicite de 'Content-Encoding' en-tête implique l'identité de l'encodage, qui est, sans aucun codage
lorsque j'entre l'url de l'api sur firefox, je ne vois que les en-têtes de réponse contenir "content-encoding = "gzip", "content-length = 278", "content-type = application/json, charset=utf-8", "varient = Accept-Encoding"
Et alors? Vous pouvez désactiver le contenu automatique de décompression ou d'exécuter avec du fil de connexion à voir raw HTTP composition de message
alors quoi, quoi? Ce qu'il veut dire est que la réponse contient un codage de contenu mis à gzip, mais la réponse http objet de ne pas les afficher. Je suis en cours d'exécution dans que des problèmes.
OriginalL'auteur ok2c
Depuis la version 4.1, Apache HttpClients poignées de demande et de réponse de compression. Vous pouvez consulter l'exemple dans une autre réponse ici.
Encore dans le cas où vous voulez vérifier si la réponse a été compressé ou non. Vous pouvez imprimer la classe de l'entité.
En cas de
gzip
la sortie seraorg.apache.http.client.entity.GzipDecompressingEntity
& pourdeflate
sonorg.apache.http.client.entity.DecompressingEntity
OriginalL'auteur Garry