Uyarlama 2 ile oturum açma


308

İstekte gönderilen tam JSON almaya çalışıyorum. İşte benim kod:

OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor(){
   @Override public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
      Request request = chain.request();
      Log.e(String.format("\nrequest:\n%s\nheaders:\n%s",
                          request.body().toString(), request.headers()));
      com.squareup.okhttp.Response response = chain.proceed(request);
      return response;
   }
});
Retrofit retrofit = new Retrofit.Builder()
   .baseUrl(API_URL)
   .addConverterFactory(GsonConverterFactory.create())
   .client(client).build();

Ama bunu sadece günlüklerde görüyorum:

request:
com.squareup.okhttp.RequestBody$1@3ff4074d
headers:
Content-Type: application/vnd.ll.event.list+json

Nasıl kaldırılması göz önüne alındığında, doğru günlüğü yapacağım setLog()ve setLogLevel()biz Recommended 1 ile kullanmak için hangi?

Yanıtlar:


697

Retrofit 2'de HttpLoggingInterceptor kullanmalısınız .

Bağımlılığı ekleyin build.gradle. Ekim 2019 itibarıyla en son sürüm:

implementation 'com.squareup.okhttp3:logging-interceptor:4.2.1'

RetrofitAşağıdaki gibi bir nesne oluşturun :

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://backend.example.com")
        .client(client)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

return retrofit.create(ApiClient.class);

Kullanımdan setLevelkaldırma uyarıları durumunda, şu şekilde değiştirin :

interceptor.level(HttpLoggingInterceptor.Level.BODY);

Yukarıdaki çözüm, eski ayarlara çok benzeyen logcat mesajları verir.

setLogLevel(RestAdapter.LogLevel.FULL)

Aşağıdaki durumlardajava.lang.ClassNotFoundException :

Eski Retrofit sürümü daha eski bir logging-interceptorsürüm gerektirebilir . Ayrıntılar için yorum bölümlerine göz atın.


30
Bu, sorumdan sadece 15 gün sonra OkHttp'e eklendi, toplumun ihtiyaçlarının bu kadar hızlı bir etki yaratması güzel!
Gabor

1
ve artık sonatype anlık görüntüleri veri havuzunu derlemenize eklemenize gerek yok.gradle
James Goodwin

13
retrofit 2.1.0 bu derlemeyi kullan 'com.squareup.okhttp3: logging-interceptor: 3.3.1'
jayellos

2
@jayellos Bunu belirttiğiniz için teşekkürler. 3.3.1'den daha düşük bir sürüm kullanıyorsanız, böyle bir yöntem istisnası elde edemezsiniz.
guydemossyrock

2
Ben alıyorum: "okhttp3.internal.Platform" sınıfı herhangi bir fikir bulamadınız mı?
corlaez

35

Sizin gibi bir şeyle tanıştım ve Android'de API'larla çalışmayı (İşte bağlantı ) (hayır! Onlara bazı reklamlar yapmıyorum ....) kitabının yazarına sormaya çalıştım .... ama gerçekten güzeller çocuklar :) Ve yazar bana hem Retrofit 1.9'da hem de Retrofit 2.0-beta'da Log yöntemiyle çok yakında cevap verdi.

İşte Retrofit 2.0-beta'nın kodu:

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();  
// set your desired log level
logging.setLevel(Level.BODY);

OkHttpClient httpClient = new OkHttpClient();  
// add your other interceptors …

// add logging as last interceptor
httpClient.interceptors().add(logging);  // <-- this is the important line!

Retrofit retrofit = new Retrofit.Builder()  
   .baseUrl(API_BASE_URL)
   .addConverterFactory(GsonConverterFactory.create())
   .client(httpClient)
   .build();

HttpLoggingInterceptor yardımıyla günlükleme yöntemini bu şekilde ekleyebilirsiniz . Ayrıca, yukarıda bahsettiğim bu kitabın okuyucusuysanız, artık Retrofit 2.0 ile günlük yöntemi olmadığını söylüyor olabilir - yazara sordum, doğru değil ve gelecek yıl konuşarak kitabı güncelleyecekler hakkında.

// Retrofit'teki Log yöntemine aşina değilseniz, daha fazla şey paylaşmak istiyorum.

Ayrıca, seçebileceğiniz bazı Günlük Kaydı Düzeyleri olduğuna dikkat edilmelidir. Çoğu zaman böyle bir şey verecek Level.BODY kullanın :

resim açıklamasını buraya girin

Resmin içindeki hemen hemen tüm http personelini bulabilirsiniz: başlık, içerik ve yanıt, vb.

Bazen partinize katılmaları için tüm konuklara gerçekten ihtiyacınız olmaz: Sadece başarılı bir şekilde bağlandığını, Internet çağrısının Activiy & Fragmetn'imde başarıyla yapıldığını bilmek istiyorum. Sonra böyle bir şey döndürecek Level.BASIC kullanmakta özgürsünüz :

resim açıklamasını buraya girin

Durum kodunun içinde 200 OK bulabilir misiniz ? Bu kadar :)

Ayrıca , yalnızca ağın başlığını döndürecek başka bir Level.HEADERS var . Tabii ki burada başka bir resim:

resim açıklamasını buraya girin

Tüm Logging hilesi bu;)

Ve sizi orada çok şey öğrendiğim öğretici ile paylaşmak istiyorum . Retrofit ile ilgili hemen hemen her şey hakkında konuşan bir sürü harika gönderi var ve aynı zamanda Retrofit 2.0 geliyor. Lütfen bu işlere bir göz atın, bence size çok zaman kazandıracak.


HttpLoggingInterceptor nereden geliyor?
Radu

5
Ayrıca, bu benim için işe yaramıyor. httpClient.interceptors.add bir com.squareup.okhttp.Interceptor istiyor ve bir okhttp3.logging.HttpLoggingInterceptor istiyor
Radu

@Radu Hangi Retrofit sürümünü kullanıyorsunuz? Gradle'ınız böyle bir şeye sahip olmalı: compile 'com.squareup.retrofit2: retrofit: 2.0.0-beta4'
peitek

Ağ yakalayıcı gibi Interceptor eklemek gerektiğinden, istek başlıklarını günlüğe kaydetmek için işe yaramaz! Bkz. Stackoverflow.com/a/36847027/2557258
Yazon2006

12

İşte Interceptorhem istek hem de yanıt gövdelerini günlüğe kaydeden (OkHttp belgelerinden ve diğer bazı SO yanıtlarından alınan bir örneğe dayanan Timber kullanarak):

public class TimberLoggingInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();

        long t1 = System.nanoTime();
        Timber.i("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers());
        Timber.v("REQUEST BODY BEGIN\n%s\nREQUEST BODY END", bodyToString(request));

        Response response = chain.proceed(request);

        ResponseBody responseBody = response.body();
        String responseBodyString = response.body().string();

        // now we have extracted the response body but in the process
        // we have consumed the original reponse and can't read it again
        // so we need to build a new one to return from this method

        Response newResponse = response.newBuilder().body(ResponseBody.create(responseBody.contentType(), responseBodyString.getBytes())).build();

        long t2 = System.nanoTime();
        Timber.i("Received response for %s in %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers());
        Timber.v("RESPONSE BODY BEGIN:\n%s\nRESPONSE BODY END", responseBodyString);

        return newResponse;
    }

    private static String bodyToString(final Request request){

        try {
            final Request copy = request.newBuilder().build();
            final Buffer buffer = new Buffer();
            copy.body().writeTo(buffer);
            return buffer.readUtf8();
        } catch (final IOException e) {
            return "did not work";
        }
    }
}

6

Bunu dene:

Request request = chain.request();
Buffer buffer = new Buffer();
request.body().writeTo(buffer);
String body = buffer.readUtf8();

Bundan sonra body, ilgilendiğiniz JSON var.


1
vücut yanıtı nasıl yazdırabilirsiniz?
Gilberto Ibarra

3
@GilbertoIbarra use String bodyString = response.body().string(); log(bodyString); response = response.newBuilder().body(ResponseBody.create(response.body().contentType(), bodyString)).build(); (Yanıtın vücudunu bir kereden fazla okuyamazsınız, bu yüzden inşaatçı ile yeni bir yanıt oluşturmanız gerekecek)
Anton Ryabyh

Daha fazla ihtiyacımız olmayan bir koltuk değneği. İşte çalışma günlüğüne bir örnek: stackoverflow.com/a/36847027/2557258
Yazon2006

6

Karşılaştığım temel sorun, üstbilgi eklemek ve bunları hata ayıklama logcat'e kaydetmektir. İki engelleme eklemeye çalıştım. Biri günlüğe kaydetme ve diğeri hareket halindeyken başlık ekleme (belirteç yetkilendirme). Sorun, .addInterceptor veya .addNetworkInterceptor olabilmemizdi. Jake Wharton'un bana söylediği gibi: "Ağ önleyicileri her zaman uygulama önleyicilerinden sonra gelir. Bkz. Https://github.com/square/okhttp/wiki/Interceptors ". İşte başlıklar ve günlükler ile çalışma örneği:

OkHttpClient httpClient = new OkHttpClient.Builder()
            //here we can add Interceptor for dynamical adding headers
            .addNetworkInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request().newBuilder().addHeader("test", "test").build();
                    return chain.proceed(request);
                }
            })
            //here we adding Interceptor for full level logging
            .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
            .build();

    Retrofit retrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gsonBuilder.create()))
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .client(httpClient)
            .baseUrl(AppConstants.SERVER_ADDRESS)
            .build();

5

SetLogLevel () Retrofit'in son 2.0 sürümünde dönüp dönmeyeceğini bilmiyorum ama şimdilik kayıt için bir önleme kullanabilirsiniz.

OkHttp wiki'de iyi bir örnek bulunabilir: https://github.com/square/okhttp/wiki/Interceptors

OkHttpClient client = new OkHttpClient();
client.interceptors().add(new LoggingInterceptor());

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://www.yourjsonapi.com")
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build();

ya sorumu okumadınız ya da bağlantı verdiğiniz sayfayı okumadınız ... çünkü LoggingInterceptor istek gövdesini günlüğe kaydetmeye çalışmaz (ve bu yüzden sorunumu çözmez)
Gabor

'DesteklenmeyenOperasyon
İstisnası

5

Retrofit2 ve okhttp3 kullanıyorsanız, Interceptor'un sıraya göre çalıştığını bilmeniz gerekir. Bu yüzden diğer Interceptor'larınızdan sonra loggingInterceptor ekleyin:

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        if (BuildConfig.DEBUG)
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);

 new OkHttpClient.Builder()
                .connectTimeout(60, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .addInterceptor(new CatalogInterceptor(context))//first
                .addInterceptor(new OAuthInterceptor(context))//second
                .authenticator(new BearerTokenAuthenticator(context))
                .addInterceptor(loggingInterceptor)//third, log at the end
                .build();

4

Retrofit'te yüksek düzeyde kayıt tutmaya ihtiyaç duyanlar için önleme cihazını şu şekilde kullanın

public static class LoggingInterceptor implements Interceptor {
    @Override public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        long t1 = System.nanoTime();
        String requestLog = String.format("Sending request %s on %s%n%s",
                request.url(), chain.connection(), request.headers());
        //YLog.d(String.format("Sending request %s on %s%n%s",
        //        request.url(), chain.connection(), request.headers()));
        if(request.method().compareToIgnoreCase("post")==0){
            requestLog ="\n"+requestLog+"\n"+bodyToString(request);
        }
        Log.d("TAG","request"+"\n"+requestLog);

        Response response = chain.proceed(request);
        long t2 = System.nanoTime();

        String responseLog = String.format("Received response for %s in %.1fms%n%s",
                response.request().url(), (t2 - t1) / 1e6d, response.headers());

        String bodyString = response.body().string();

        Log.d("TAG","response"+"\n"+responseLog+"\n"+bodyString);

        return response.newBuilder()
                .body(ResponseBody.create(response.body().contentType(), bodyString))
                .build();
        //return response;
    }
}

public static String bodyToString(final Request request) {
    try {
        final Request copy = request.newBuilder().build();
        final Buffer buffer = new Buffer();
        copy.body().writeTo(buffer);
        return buffer.readUtf8();
    } catch (final IOException e) {
        return "did not work";
    }
}`

Nezaket : https://github.com/square/retrofit/issues/1072#


github.com/square/retrofit/issues/1072# adresinden kopyaladığınızı belirtmelisiniz (kaynağınıza kredi vermek için)
Gabor

Daha fazla ihtiyacımız olmayan bir koltuk değneği. İşte çalışma günlüğüne bir örnek: stackoverflow.com/a/36847027/2557258
Yazon2006

4

Kotlin Kodu

        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        val client = OkHttpClient.Builder().addInterceptor(interceptor).build()
        val retrofit = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build()

        return retrofit.create(PointApi::class.java)

2

Ayrıca Facebook Stetho'yu ekleyebilir ve Chrome'daki ağ izlerine bakabilirsiniz: http://facebook.github.io/stetho/

final OkHttpClient.Builder builder = new OkHttpClient.Builder();
if (BuildConfig.DEBUG) {
    builder.networkInterceptors().add(new StethoInterceptor());
}

Ardından Chrome'da "chrome: // inspect" i açın ...


2

bu, Günlüğe Kaydetme ile bir geriye dönük yükseltme nesnesi oluşturur. ayrı nesneler oluşturmadan.

 private static final Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(new OkHttpClient().newBuilder()
                    .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
                    .readTimeout(READ_TIMEOUT_SECONDS, TimeUnit.SECONDS)
                    .writeTimeout(WRITE_TIMEOUT_SECONDS, TimeUnit.SECONDS)
                    .connectTimeout(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
                    .build())
            .addConverterFactory(GsonConverterFactory.create())
            .build();

2

İlk build.gradle bağımlılığını ekleyin:

'com.squareup.okhttp3: günlüğe kaydetme-önleme: 3.12.1'

Kotlin'i kullanırken aşağıdaki gibi Günlüğe Karşı Durdurucu ekleyebilirsiniz:

companion object {
    val okHttpClient = OkHttpClient().newBuilder()
            .addInterceptor(HttpLoggingInterceptor().apply {
                level = HttpLoggingInterceptor.Level.BODY
            })
            .build()


    fun getRetrofitInstance(): Retrofit {
        val retrofit = Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl(ScanNShopConstants.BASE_URL)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build()

        return retrofit
    }
}

2

Aşağıdaki kod kümesi benim için sorunsuz çalışıyor

Gradle

// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.1'

RetrofitClient

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(logging)
        .build();

retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build();

Ayrıca, Android Studio'nun altındaki Profiler Sekmesine gidip Yeni Bir Oturum Başlatmak için + işaretini tıklayıp ardından "Ağ" da istenen artışı seçerek sonuçları doğrulayabilirsiniz. Orada her şeyi alabilirsiniz, ama hantal ve yavaş. Lütfen aşağıdaki resme bakın.

resim açıklamasını buraya girin


1

Retrofit 2'de bunu doğru yapmanın en iyi yolu, logger önleyicisini bir ağ olarak eklemektir. Bu, ağ başlıklarını ve özel başlıklarınızı da yazdıracaktır. Önemli olan, önleme cihazının bir yığın olarak çalıştığını hatırlamak ve günlükçüyü en sonunda eklediğinizden emin olmaktır.

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.addInterceptor(new MyCustomInterceptor());
builder.connectTimeout(60, TimeUnit.SECONDS);
builder.readTimeout(60, TimeUnit.SECONDS);
builder.writeTimeout(60, TimeUnit.SECONDS);
// important line here
builder.addNetworkInterceptor(LoggerInterceptor());

1

Buradaki cevabın çoğu, günlüğü görmenin en havalı yollarından biri olan bu araç hariç hemen hemen her şeyi kapsar.

Öyle Facebook'un Stetho . Bu, uygulamanızın ağ trafiğini google chrome'da izlemek / kaydetmek için mükemmel bir araçtır . Burada Github'da da bulabilirsiniz .

resim açıklamasını buraya girin


1

Retrofit 2.0.2 için kod şöyle

   **HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient.Builder httpClient=new OkHttpClient.Builder();
        httpClient.addInterceptor(logging);**


        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    **.client(httpClient.build())**
                    .build();
        }

1

Günlükleri kullanarak herhangi bir istek / yanıt parametresini filtrelemenin basit bir yolu HttpLoggingInterceptor:

// Request patterns to filter
private static final String[] REQUEST_PATTERNS = {
    "Content-Type",
};
// Response patterns to filter
private static final String[] RESPONSE_PATTERNS = {"Server", "server", "X-Powered-By", "Set-Cookie", "Expires", "Cache-Control", "Pragma", "Content-Length", "access-control-allow-origin"};

// Log requests and response
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
    @Override
    public void log(String message) {

        // Blacklist the elements not required
        for (String pattern: REQUEST_PATTERNS) {
            if (message.startsWith(pattern)) {
                return;
            }
        }
        // Any response patterns as well...
        for (String pattern: RESPONSE_PATTERNS) {
            if (message.startsWith(pattern)) {
                return;
            }
        }
        Log.d("RETROFIT", message);
    }
});
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

İşte tam öz:

https://gist.github.com/mankum93/179c2d5378f27e95742c3f2434de7168


1

Ben de benzer bir durumda sıkışmıştı setLevel(), ben HttpLoggingInterceptor örneği ile çağırmaya çalışırken , yöntem gelmiyordu, şöyle:

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

İşte bunu nasıl çözdüm, Retrofit2 için günlük oluşturmak için,

Sanırım bağımlılığı ekledin,

implementation "com.squareup.okhttp3:logging-interceptor:4.7.2"

En son sürüm için şu bağlantıyı kontrol edebilirsiniz:

https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor )

Burada nasıl ekleyeceklerini de açıkladılar.

İsimle bir sınıf oluşturdum AddLoggingInterceptor, işte kodum,

public class AddLoggingInterceptor {

    public static OkHttpClient setLogging(){
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(loggingInterceptor)
                .build();

        return okHttpClient;
    }
}

Sonra, Retrofitimizi somutlaştırdığımız yerde,

 public static Retrofit getRetrofitInstance() {
    if (retrofit == null) {
        retrofit = new retrofit2.Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(AddLoggingInterceptor.setLogging()) // here the method is called inside client() method, with the name of class, since it is a static method.
                .build();
    }
    return retrofit;
}

Artık Android Studio'nuzda oluşturulan günlüğü görebilirsiniz, okHttpfiltreleme işlemi için arama yapmanız gerekebilir . Benim için çalıştı. Herhangi bir sorun olursa bana mesaj gönderebilirsiniz.


0

Retrofit için Print Log yolunu buldum

OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();
                    if (BuildConfig.DEBUG) {
                        Log.e(getClass().getName(), request.method() + " " + request.url());
                        Log.e(getClass().getName(), "" + request.header("Cookie"));
                        RequestBody rb = request.body();
                        Buffer buffer = new Buffer();
                        if (rb != null)
                            rb.writeTo(buffer);
                        LogUtils.LOGE(getClass().getName(), "Payload- " + buffer.readUtf8());
                    }
                    return chain.proceed(request);
                }
            })
            .readTimeout(60, TimeUnit.SECONDS)
            .connectTimeout(60, TimeUnit.SECONDS)
            .build();

            iServices = new Retrofit.Builder()
                    .baseUrl("Your Base URL")
                    .client(okHttpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
                    .create(Your Service Interface .class);

Benim için çalışıyor.


0

Retrofit'in önleme sistemi, http istekleriyle çalışmanıza izin veren harika bir özelliktir. İki tür vardır: uygulama ve ağ önleyicileri.

Charles Web Debugging Proxy Applicationİsteklerinizi / yanıtlarınızı günlüğe kaydetmeniz gerekiyorsa kullanmanızı öneririm . Çıktı Stetho'ya çok benzer, ancak bir uygulamaya bağımlı olarak eklemeniz gerekmeyen daha güçlü bir araçtır


-11

hey millet already ben zaten çözüm bulmak:

  public static <T> T createApi(Context context, Class<T> clazz, String host, boolean debug) {
    if (singleton == null) {
        synchronized (RetrofitUtils.class) {
            if (singleton == null) {
                RestAdapter.Builder builder = new RestAdapter.Builder();
                builder
                        .setEndpoint(host)
                        .setClient(new OkClient(OkHttpUtils.getInstance(context)))
                        .setRequestInterceptor(RequestIntercepts.newInstance())
                        .setConverter(new GsonConverter(GsonUtils.newInstance()))
                        .setErrorHandler(new ErrorHandlers())
                        .setLogLevel(debug ? RestAdapter.LogLevel.FULL : RestAdapter.LogLevel.NONE)/*LogLevel.BASIC will cause response.getBody().in() close*/
                        .setLog(new RestAdapter.Log() {
                            @Override
                            public void log(String message) {
                                if (message.startsWith("{") || message.startsWith("["))
                                    Logger.json(message);
                                else {
                                    Logger.i(message);
                                }
                            }
                        });
                singleton = builder.build();
            }
        }
    }
    return singleton.create(clazz);
}

setLog'un geri araması her günlüğü girebilir
Vihuela Yao

1
Bu v2 değil, yeni donanım v1 kullanıyor
Gabor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.