Retrofit 2.0-Beta1 Lectura de la respuesta de Observable

Estoy tratando de leer el código httpstatus e cuerpo en el caso de éxito de una solicitud. Así que creé el código a continuación para probar, pero no pude obtener el onNext llamado, traté de usar la clase okhttp (com.squareup.okhttp.Response) y Retrofit Response (retrofit.Response), pero no pude hacer que funcione .

¿Puede alguien ayudarme a leer el código de cuerpo y httpstatus aquí? Me gustaría seguir utilizando los Observables. Gracias por adelantado.

 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(); } }); } } 

Tengo la respuesta.

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

En realidad, response.body () es un objeto, puede convertirlo a otro tipo. En este caso, es ResponseBody.

Lo conseguí trabajando con el código de abajo, era necesario utilizar los genéricos de retrofit.Response con 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(); } }); } } 

Debe definir el Observable de su interfaz como

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

Entonces usted puede conseguir fácilmente el cuerpo de la respuesta en onNext () como esto:

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

A veces el response.toString () o response.body () le da cadena ilegible, tuve que obtener los bytes del cuerpo de la respuesta y construir una nueva cadena de la misma.

 @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()); } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.