2014-07-09 13 views
8

Ich bin neu in Retrofit, aber es scheint wirklich mächtig. Alles funktioniert mit einem normalen JSON in Ordnung, aber sobald ich versuche, eine GZIPed eines bekomme ich nur einen Fehler:Retrofit + OkHttp + GZIP-ed JSON

I/System.out(14883): ------retrofit.RetrofitError: retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1

Offensichtlich ist die die unsinnigen Symbole ich im Log können nicht sehen, wie JSON analysiert werden.

Ich dachte, okHttp ist das gzip Zeug richtig einholen? Was fehlt mir?

Diese Gläser sind in meinem libs Ordner:

retrofit-1.6.1.jar 
okhttp-2.0.0.jar 
gson-2.2.4.jar 

So kann ich den Anruf bin ab:

public interface OvlService { 
    @GET("/gziptest.gz") 
    void getOvls(Callback<OvlWrapper> callback); 
} 
... 
OkHttpClient okHttpClient = new OkHttpClient(); 
Executor executor = Executors.newCachedThreadPool(); 
RestAdapter restAdapter = new RestAdapter.Builder() 
.setEndpoint("http://my.domain") // The base API endpoint. 
.setLogLevel(RestAdapter.LogLevel.FULL) 
.setExecutors(executor, executor) 
.setClient(new OkClient(okHttpClient)) 
.build(); 

OvlService ovlService = restAdapter.create(OvlService.class); 

ovlService.getOvls(new Callback<OvlWrapper>() { 

    @Override 
    public void success(OvlWrapper arg0, Response arg1) { 
     System.out.println("result: " + arg0.toString()); 
    } 
}); 

Die result: -Linie wird niemals angezeigt, sondern ich sehe viele davon Sachen T�� �����=�Mk�A�G�4.��@��A�� im RetrofitLog. Was mache ich falsch, dass das gzip nicht dekomprimiert wird? Vielen Dank!

Edit:

Ich versuchte es mit einer gzip-Datei auf meinem Testserver (server.com/ovl.gz) und ich versuchte es auch mit dem Original-api-Server (server2.com/api.php?id=ovlgzip). Gleiches Ergebnis, aber unterschiedliche Header:

Testserver:

HTTP/1.1 200 OK 
Accept-Ranges: bytes 
Connection: close 
Content-Length: 477 
Content-Type: application/x-gzip 
ETag: "2cc40cb-1dd-..." 
Last-Modified: Tue, 08 Jul 2014 17:00:08 GMT 
OkHttp-Received-Millis: 1404950522590 
OkHttp-Response-Source: NETWORK 200 
OkHttp-Selected-Transport: http/1.1 
OkHttp-Sent-Millis: 1404950522533 
Server: Apache 
�������������}�Qk�0���... 

Original-Server:

HTTP/1.1 200 OK 
Connection: Keep-Alive 
Content-Type: application/json 
Keep-Alive: timeout=4, max=1000 
OkHttp-Received-Millis: 1404950697627 
OkHttp-Response-Source: NETWORK 200 
OkHttp-Selected-Transport: http/1.1 
OkHttp-Sent-Millis: 1404950697002 
Server: Apache 
Transfer-Encoding: chunked 
X-Powered-By: PHP/5.3.3-7+squeeze19 
�������������}�Qk�0���... 
+0

Wie sehen die Antwortheader aus? –

+2

Die Antwort-Header oben hinzugefügt. Ich spielte auch mit 'RequestInterceptor' herum - aber ohne Erfolg ... –

+3

Die Kopfzeile meldet, dass die Antwort eine gzip-Datei ist, nicht, dass die Antwort gezippt wird. Wenn die Antwort gezippt wurde, würde ein Header "Content-Encoding: gzip" vorhanden sein. –

Antwort

3

Dank Jake Whartons comment es stellte sich heraus, das Content-Encoding: gzip Header fehlte. Da ich den Server diese Header hinzufügen gesagt, funktioniert alles einwandfrei:

<?php 
$data = ...; 
$gzdata = gzencode($data, 9, FORCE_GZIP); 
header('Content-Encoding: gzip'); 
header('Content-Length: '.strlen($gzdata)); 
... ?> 
2

Wenn Sie eine gzipped Datei mit Erweiterung .gz herunterladen, den Sie verwenden Apache und Sie haben mod_mime aktiviert. Dann können Sie diese Anweisung zur Virtualhost oder die .htaccess-Datei hinzufügen:

AddEncoding gzip .gz 

Auf diese Weise, wenn Sie eine Datei mit Erweiterung .gz anfordert, Apache wird das „Content-Encoding automatisch hinzufügen: gzip "Header auf die Antwort (Dateiausgabe) und okhttp wird automatisch den Antworttext decodieren.

Verwandte Themen