2015-09-18 32 views
9

Sto provando a leggere il codice e il corpo httpstatus nel caso di successo di una richiesta. Così ho creato il codice qui sotto per testare, ma non sono riuscito a richiamare onNext, ho provato a utilizzare la classe okhttp (com.squareup.okhttp.Response) e la classe di retrofit Risposta (retrofit.Response), ma non ho potuto Lo faccio funzionareRetrofit 2.0-Beta1 Lettura risposta da Osservabile

Qualcuno può aiutarmi a leggere il corpo e il codice httpstatus qui? Mi piacerebbe continuare a usare gli Observables. Grazie in anticipo.

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

risposta

4

ho preso a lavorare con il codice qui sotto, è stato quello di necessario per utilizzare i farmaci generici di 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(); 
      } 
     }); 
    } 
} 
+0

io sono in grado di importare retrofit.RxJavaCallAdapterFactory in retrofit 2.0.0-beta1, potete per favore darmi una mano su come stai usando classe RxJavaCallAdapterFactory. –

+1

compile 'com.squareup.retrofit: adapter-rxjava: 2.0.0-beta1' ha funzionato. –

+0

come convertire questa risposta all'oggetto reale? –

2

È necessario definire di vostra interfaccia osservabile come

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

Poi si può e asily ottenere il corpo risposta in onNext() come questo:

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

ho avuto la risposta.

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

... 

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

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

In realtà, response.body() è un oggetto, è possibile lanciare ad un altro type.In questo caso, è responseBody.

1

A volte il response.toString() o response.body() fornisce una stringa illeggibile, ho dovuto ottenere i byte dal corpo della risposta e costruire una nuova stringa da esso.

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

}