2015-10-09 3 views
12

Я использую Retrofit 2.0b2. После получения ответа, я пытался получать InputStream из ответа на:retrofit 2.0b2: Как получить InputStream из ответа?

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

но приложение продолжать бросать:

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 ... 

Несмотря на ответ правильно вернулся. Что я здесь делаю неправильно?

+0

хорошо ясно проблема заключается в том, что вы получаете ответ по типу 'JsonNode', а не то, что не получает автоматически преобразуются (потому что автоматическое преобразование считывает его из потока, и ничего не остается для потока байт) , Попробуйте 'Ответ '? – EpicPandaForce

+0

Пробовал, nope. Все еще не удалось, является ли это «JsonNode» или «Void» или «Object». – CatFly

ответ

16

Если вы хотите необработанный поток, скажите переоснащению вернуть OkHttp ResponseBody.

import okhttp3.ResponseBody; 
import retrofit2.Response; 

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

Не забудьте обновить интерфейс.

As the response body is backed by a limited resource, the responseBody object must be closed after usage. Поэтому выше код использует примерочных с-ресурсами заявление.

+0

Спасибо @iagreen, ваш ответ абсолютно правильный. Мне было трудно найти правильный способ конвертировать «ResponseBody» в raw json, чтобы продолжить работу. Спасибо =) –

Смежные вопросы