2015-10-09 8 views
12

Ich benutze Retrofit 2.0b2. Nachdem eine Antwort zu erhalten, habe ich versucht, einen Inputstream aus der Antwort bekommen von:Retrofit 2.0b2: Wie InputStream von der Antwort erhalten?

Response<JsonNode> response = call.execute(); 
InputStream is = response.raw().body().byteStream(); 

aber die App halten zu werfen:

java.lang.IllegalStateException: Cannot read raw response body of a converted body. 
     at retrofit.OkHttpCall$NoContentResponseBody.source(OkHttpCall.java:184) 
     at com.squareup.okhttp.ResponseBody.byteStream(ResponseBody.java:43) 
     at ... 

Trotz der Antwort korrekt zurückgegeben. Was mache ich hier falsch?

+0

Nun klar das Problem ist, dass Sie eine Antwort nach Art von 'JsonNode' bekommen, anstatt etwas, das nicht automatisch konvertiert wird (weil automatische Konvertierung liest es aus dem Stream und nichts bleibt für den Byte-Stream) . Versuchen Sie 'Antwort '? – EpicPandaForce

+0

Versucht, nein. Immer noch fehlgeschlagen, ob es "JsonNode" oder "Void" oder "Object" ist. – CatFly

Antwort

16

Wenn Sie den Rohdatenstrom möchten, melden Sie Nachrüstung, um ein OKHttp ResponseBody zurückzugeben.

import okhttp3.ResponseBody; 
import retrofit2.Response; 

Response<ResponseBody> response = call.execute(); 
try (ResponseBody responseBody = response.body()) { 
    InputStream is = responseBody.byteStream(); 
    // ... 
} 

Denken Sie daran, auch Ihre Schnittstelle zu aktualisieren.

As the response body is backed by a limited resource, the responseBody object must be closed after usage. Daher verwendet der obige Code eine try-with-resources-Anweisung.

+0

Danke @iagreen, Ihre Antwort ist absolut richtig. Es fiel mir schwer, den richtigen Weg zu finden, um das "ResponseBody" in ein rohes JSON zu konvertieren, um mit meiner Arbeit fortzufahren. Danke =) –

Verwandte Themen