2015-09-18 15 views
9

से प्रतिक्रिया पढ़ें मैं अनुरोध के सफलता के मामले में httpstatus कोड ई बॉडी को पढ़ने की कोशिश कर रहा हूं। तो मैंने परीक्षण करने के लिए नीचे दिया गया कोड बनाया लेकिन मुझे onNext नामक विफल करने में असफल रहा, मैंने ओखेट (com.squareup.okhttp.Response) और रेट्रोफिट प्रतिक्रिया (retrofit.Response) वर्ग का उपयोग करने का प्रयास किया, लेकिन मैं ' इसे काम नहीं करते हैं।रेट्रोफिट 2.0-बीटा 1 अवलोकननीय

क्या कोई मुझे शरीर और httpstatus कोड को पढ़ने में मदद कर सकता है? मैं पर्यवेक्षकों का उपयोग करना जारी रखना चाहूंगा। अग्रिम धन्यवाद।

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

मैं इसे नीचे दिए गए कोड के साथ काम मिल गया है, यह ResponseBody साथ retrofit.Response की जेनरिक का उपयोग करने के लिए आवश्यक करने के लिए था

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

तो फिर तुम ई कर सकते हैं asily onNext() इस तरह में प्रतिक्रिया शरीर मिलता है:

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

मैं पुराना वापस में retrofit.RxJavaCallAdapterFactory आयात करने के लिए 2.0.0-beta1 में असमर्थ हूँ, क्या आप मुझे कैसे आप RxJavaCallAdapterFactory वर्ग का उपयोग कर रहे पर बाहर कर सकते हैं। –

+1

संकलित 'com.squareup.retrofit: एडाप्टर-आरएक्सजेवा: 2.0.0-बीटा 1' काम किया। –

+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

मैं इस सवाल का जवाब मिल गया।

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

कभी-कभी प्रतिक्रिया .toString() या respond.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()); 
    } 

} 
संबंधित मुद्दे