2015-10-09 17 views
12

Tôi đang sử dụng Retrofit 2.0b2. Sau khi nhận được phản hồi, tôi đã cố gắng nhận được một InputStream từ phản ứng bằng cách:trang bị thêm 2.0b2: Cách nhận InputStream từ phản hồi?

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

nhưng ứng dụng giữ ném:

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

Mặc dù phản ứng lại một cách chính xác. Tôi làm gì sai ở đây ?

+0

rõ ràng vấn đề là bạn đang nhận được phản hồi theo loại 'JsonNode', thay vì cái gì đó không tự động chuyển đổi (vì tự động chuyển đổi đọc từ luồng và không có gì còn lại cho luồng byte) . Thử 'Response '? – EpicPandaForce

+0

Đã thử, không. Vẫn thất bại cho dù đó là 'JsonNode' hoặc 'Void' hoặc 'Object'. – CatFly

Trả lời

16

Nếu bạn muốn luồng thô, hãy cho trang bị thêm để trả lại một OkHttp ResponseBody.

import okhttp3.ResponseBody; 
import retrofit2.Response; 

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

Hãy nhớ cập nhật giao diện của bạn.

As the response body is backed by a limited resource, the responseBody object must be closed after usage. Do đó, mã trên sử dụng báo cáo try-with-resources.

+0

Cảm ơn @iagreen, Câu trả lời của bạn là hoàn toàn chính xác. Tôi đã có một thời gian khó khăn để tìm đúng cách để chuyển đổi 'ResponseBody' thành một json thô để đi trước với công việc của tôi. Cảm ơn bạn =) –

Các vấn đề liên quan