Retrofit 2.0-Beta1 Читать отзыв от наблюдаемого

Я пытаюсь прочитать тело httpstatus code e body в случае успеха запроса. Поэтому я создал код ниже, чтобы проверить, но мне не удалось получить onNext , я попытался использовать класс okhttp (com.squareup.okhttp.Response) и модифицировать Response (retrofit.Response), но я не мог заставить его работать ,

Может ли кто-нибудь помочь мне прочитать тело и код httpstatus здесь? Я хотел бы продолжать использовать Observables. Заранее спасибо.

 package com.app.rest; import com.squareup.okhttp.Response; import retrofit.GsonConverterFactory; import retrofit.Retrofit; import retrofit.RxJavaCallAdapterFactory; import retrofit.http.GET; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class TestApiClient { public interface Test { @GET("/posts") Observable<Response> getPosts(); } public TestApiClient() { new Retrofit.Builder() .baseUrl("http://jsonplaceholder.typicode.com") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build().create(Test.class).getPosts().subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<Response>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { e.toString(); } @Override public void onNext(Response response) { response.toString(); } }); } } 

Solutions Collecting From Web of "Retrofit 2.0-Beta1 Читать отзыв от наблюдаемого"

Я получил ответ.

 import com.squareup.okhttp.ResponseBody; import retrofit.Response; ... public Observable<Response<ResponseBody>> xxx(){} ... Playlist playlist = Playlist.parse(((ResponseBody)response.body()).byteStream()); 

Фактически, response.body () – объект, вы можете передать его другому типу. В этом случае это ResponseBody.

Я получил его работу с кодом ниже, он должен был использовать дженерики retrofit.Response с ResponseBody :

 package com.app.rest; import com.squareup.okhttp.ResponseBody; import retrofit.GsonConverterFactory; import retrofit.Response; import retrofit.Retrofit; import retrofit.RxJavaCallAdapterFactory; import retrofit.http.GET; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class TestApiClient { public interface Test { @GET("/posts") Observable<Response<ResponseBody>> getPosts(); } public TestApiClient() { new Retrofit.Builder() .baseUrl("http://jsonplaceholder.typicode.com") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build().create(Test.class).getPosts().subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<Response<ResponseBody>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { e.toString(); } @Override public void onNext(Response<ResponseBody> response) { response.toString(); } }); } } 

Вам необходимо определить Observable вашего интерфейса как

@GET("/posts") Observable<Result<MyPost>>

Тогда вы можете легко получить тело ответа в onNext () следующим образом:

 @Override public void onNext(Result<MyPost> result) { result.response().body(); } 

Иногда response.toString () или response.body () дает вам нечитаемую строку, мне пришлось получить байты из тела ответа и построить из нее новую строку.

 @Override public void onNext(Response<ResponseBody> response) { try { String responseStr = new String(response.body().bytes()); Log.d("responseBodyResponse", responseStr); } catch (Exception e) { Log.d("responseBodyResponse Exception", e.getMessage()); } }