2015-09-18 15 views
9

要求の成功の場合にhttpstatusコードの本文を読み込もうとしています。私はテストするために以下のコードを作成しましたが、私はokhttp(com.squareup.okhttp.Response)とretrofitレスポンス(retrofit.Response)クラスを使用しようとしましたが、onNextが呼び出されませんでしたが、それを機能させる。改定履歴2.0-Beta1閲覧可能からの応答を読み取る

身体とhttpstatusコードを読むのに助けてくれる人はいますか?私はObservablesを使い続けたいと思います。 ありがとうございます。あなたは、あなたのインターフェースのが観察定義する必要が

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

答えて

4

私はそれが以下のコードで作業しました、それはResponseBodyretrofit.Responseのジェネリック医薬品を使用するために必要なことでした

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

その後、あなたは電子ことができます私は答えを得た

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

私は改造2.0.0-β1でretrofit.RxJavaCallAdapterFactoryをインポートすることができません、あなたはRxJavaCallAdapterFactoryクラスを使用しているどのように私を助けてくださいすることができます。 –

+1

コンパイル 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1'が動作しました。 –

+0

このレスポンスを実際のオブジェクトに変換するにはどうすればよいですか? –

2

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

:asilyこのようonNext()にレスポンスボディを取得します。

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

... 

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

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

は実は、response.body()オブジェクトである、あなたは別のtype.Inにこのような場合、それをキャストすることができ、それが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()); 
    } 

} 
関連する問題