从Observable改进2.0-Beta1读取响应

我正在尝试阅读请求成功情况下的httpstatus代码e身体。 所以我创build了下面的代码来testing,但我没有得到onNext调用,我试图使用okhttp (com.squareup.okhttp.Response)和改进Response (retrofit.Response)类,但我不能让它工作。

有人可以帮助我在这里阅读正文和httpstatus代码? 我想继续使用Observable。 提前致谢。

 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 "从Observable改进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()是一个Object,你可以把它转换成另一个types。在这种情况下,它是ResponseBody。

我用它来处理下面的代码,它需要使用retrofit的generics。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()会给你一个不可读的string,我不得不从响应体获取字节,并从中构造一个新的string。

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