2015-09-18 74 views
9

我试图在请求成功的情况下读取httpstatus代码e body。所以我创建了下面的代码来测试,但我没有得到onNext的调用,我试图使用okhttp(com.squareup.okhttp.Response)和改造回复(retrofit.Response)类,但我不能'让它工作。从Observable改造2.0-Beta1读取响应

有人可以帮我阅读正文和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(); 
      } 
     }); 
    } 
} 

回答

4

我得到了它与下面的代码的工作,这是需要与ResponseBody使用retrofit.Response的仿制药:

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

我无法导入retrofit.RxJavaCallAdapterFactory在改造2.0.0-β1,你可以请帮我在你如何使用RxJavaCallAdapterFactory类。 –

+1

编译'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1'工作。 –

+0

如何将此响应转换为实物? –

2

您需要定义你的界面的观察为

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

然后你可以通过电子邮件asily得到的回应身体onNext()这样的:

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

我得到了答案。

import com.squareup.okhttp.ResponseBody; 
import retrofit.Response; 

... 

public Observable<Response<ResponseBody>> xxx(){} 
... 

Playlist playlist = Playlist.parse(((ResponseBody)response.body()).byteStream()); 

实际上,response.body()是一个Object,你可以将它转换为另一个类型。在这种情况下,它是ResponseBody。

1

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

}