2015-09-18 71 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()); 
    } 

}