Android: Die HTTP-Kommunikation sollte "Akzeptanzkodierung: Gzip" verwenden.
-
21-09-2019 - |
Frage
Ich habe eine HTTP -Kommunikation zu einem Webserver, der JSON -Daten anfordert. Ich hätte gerne diesen Datenstrom komprimieren Content-Encoding: gzip
. Gibt es eine Möglichkeit, wie ich setzen kann? Accept-Encoding: gzip
in meinem httpclient? Die Suche nach gzip
In den Android -Referenzen wird nichts mit HTTP in Bezug auf HTTP angezeigt, wie Sie sehen können hier.
Lösung
Sie sollten HTTP -Header verwenden, um anzuzeigen, dass eine Verbindung Gzip -codierte Daten akzeptieren kann, z. B.:
HttpUriRequest request = new HttpGet(url);
request.addHeader("Accept-Encoding", "gzip");
// ...
httpClient.execute(request);
Überprüfen Sie die Antwort auf die Inhaltscodierung:
InputStream instream = response.getEntity().getContent();
Header contentEncoding = response.getFirstHeader("Content-Encoding");
if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
instream = new GZIPInputStream(instream);
}
Andere Tipps
Wenn Sie die API -Stufe 8 oder höher verwenden, gibt es Androidhttpclient.
Es hat Helfermethoden wie:
public static InputStream getUngzippedContent (HttpEntity entity)
und
public static void modifyRequestToAcceptGzipResponse (HttpRequest request)
was zu viel prägnanterer Code führt:
AndroidHttpClient.modifyRequestToAcceptGzipResponse( request );
HttpResponse response = client.execute( request );
InputStream inputStream = AndroidHttpClient.getUngzippedContent( response.getEntity() );
Ich denke, die Probe des Codes in diesem Link ist interessanter:ClientgzipContentCompression.java
Sie benutzen Httprequestinterceptor und HttPresponseInterceptor
Beispiel für Anfrage:
httpclient.addRequestInterceptor(new HttpRequestInterceptor() {
public void process(
final HttpRequest request,
final HttpContext context) throws HttpException, IOException {
if (!request.containsHeader("Accept-Encoding")) {
request.addHeader("Accept-Encoding", "gzip");
}
}
});
Beispiel für Antwort:
httpclient.addResponseInterceptor(new HttpResponseInterceptor() {
public void process(
final HttpResponse response,
final HttpContext context) throws HttpException, IOException {
HttpEntity entity = response.getEntity();
Header ceheader = entity.getContentEncoding();
if (ceheader != null) {
HeaderElement[] codecs = ceheader.getElements();
for (int i = 0; i < codecs.length; i++) {
if (codecs[i].getName().equalsIgnoreCase("gzip")) {
response.setEntity(
new GzipDecompressingEntity(response.getEntity()));
return;
}
}
}
}
});
Ich habe GZIP nicht verwendet, aber ich würde annehmen, dass Sie den Eingabestream von Ihrem verwenden sollten HttpURLConnection
oder HttpResponse
wie GZIPInputStream
, und nicht eine bestimmte andere Klasse.
In meinem Fall war es so:
URLConnection conn = ...;
InputStream instream = conn.getInputStream();
String encodingHeader = conn.getHeaderField("Content-Encoding");
if (encodingHeader != null && encodingHeader.toLowerCase().contains("gzip"))
{
instream = new GZIPInputStream(instream);
}