Masuk dengan Retrofit 2

308

Saya mencoba untuk mendapatkan JSON persis yang dikirim dalam permintaan. Ini kode saya:

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

Tapi saya hanya melihat ini di log:

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

Bagaimana saya seharusnya melakukan pencatatan yang benar, mengingat penghapusan setLog()dan setLogLevel()yang kami gunakan dengan Retrofit 1?

Gabor
sumber

Jawaban:

697

Di Retrofit 2 Anda harus menggunakan HttpLoggingInterceptor .

Tambahkan ketergantungan ke build.gradle. Versi terbaru per Oktober 2019 adalah:

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

Buat Retrofitobjek seperti berikut:

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

Dalam hal peringatan penghentian, cukup ubah setLevelke:

interceptor.level(HttpLoggingInterceptor.Level.BODY);

Solusi di atas memberi Anda pesan logcat sangat mirip dengan yang lama ditetapkan oleh

setLogLevel(RestAdapter.LogLevel.FULL)

Dalam haljava.lang.ClassNotFoundException :

Versi Retrofit yang lebih lama mungkin memerlukan logging-interceptorversi yang lebih lama . Lihatlah bagian komentar untuk detailnya.

klimat
sumber
30
Ini ditambahkan ke OkHttp hanya 15 hari setelah pertanyaan saya, bagus bahwa kebutuhan komunitas membuat dampak yang cepat!
Gabor
1
dan Anda tidak perlu lagi menambahkan repositori snapshot sonatype ke build.gradle Anda
James Goodwin
13
retrofit 2.1.0 menggunakan kompilasi ini 'com.squareup.okhttp3: logging-interceptor: 3.3.1'
jayellos
2
@ jayellos Terima kasih telah menunjukkan itu. Jika Anda menggunakan versi yang lebih rendah dari versi 3.3.1 Anda tidak akan mendapatkan pengecualian metode seperti itu.
guydemossyrock
2
Saya mendapatkan: Tidak menemukan kelas "okhttp3.internal.Platform" ide apa pun?
corlaez
35

Saya bertemu hal itu ketika Anda dan saya mencoba bertanya kepada penulis buku Retrofit: Cinta bekerja dengan API di Android (di sini adalah tautannya ) (tidak! Saya tidak membuat beberapa iklan untuk mereka .... tetapi mereka benar-benar baik guys :) Dan penulis membalas saya segera, dengan kedua metode Log pada Retrofit 1.9 dan Retrofit 2.0-beta.

Dan di sini adalah kode Retrofit 2.0-beta:

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

Ini adalah cara menambahkan metode logging dengan bantuan HttpLoggingInterceptor . Juga jika Anda adalah pembaca buku yang saya sebutkan di atas, Anda mungkin menemukan bahwa dikatakan tidak ada lagi metode log dengan Retrofit 2.0 - yang, saya tanyakan kepada penulis, tidak benar dan mereka akan memperbarui buku tahun depan dengan berbicara tentang itu.

// Jika Anda tidak terbiasa dengan metode Log di Retrofit, saya ingin membagikan sesuatu yang lebih.

Juga harus diperhatikan bahwa ada beberapa Level Logging yang bisa Anda pilih. Saya menggunakan Level. Tubuh sebagian besar waktu, yang akan memberikan beberapa hal seperti ini:

masukkan deskripsi gambar di sini

Anda dapat menemukan hampir semua staf http di dalam gambar: header, konten dan respons, dll.

Dan kadang-kadang Anda benar-benar tidak perlu semua tamu untuk menghadiri pesta Anda: Saya hanya ingin tahu apakah itu berhasil terhubung, bahwa panggilan internet berhasil dilakukan dalam Activiy & Fragmetn saya. Maka Anda bebas menggunakan Level.BASIC , yang akan mengembalikan sesuatu seperti ini:

masukkan deskripsi gambar di sini

Dapatkah Anda menemukan kode status 200 OK di dalam? Hanya itu saja :)

Juga ada satu lagi, Level.HEADERS , yang hanya akan mengembalikan header jaringan. Ya tentu saja gambar lain di sini:

masukkan deskripsi gambar di sini

Itu semua trik Logging;)

Dan saya ingin membagikan kepada Anda tutorial yang saya pelajari banyak di sana . Mereka memiliki banyak posting hebat yang berbicara tentang hampir semua yang berhubungan dengan Retrofit, dan mereka terus memperbarui posting tersebut, pada saat yang sama Retrofit 2.0 akan datang. Silakan lihat pekerjaan itu, yang saya pikir akan menghemat banyak waktu.

Anthonyeef
sumber
Dari mana HttpLoggingInterceptor berasal?
Radu
5
Juga, ini tidak berhasil untuk saya. httpClient.interceptors.add ingin com.squareup.okhttp.Interceptor dan bukan okhttp3.logging.HttpLoggingInterceptor
Radu
@Radu Versi Retrofit mana yang Anda pakai? Gradle Anda seharusnya memiliki sesuatu seperti ini: kompilasi 'com.squareup.retrofit2: retrofit: 2.0.0-beta4'
peitek
Ini tidak akan berfungsi untuk mencatat header permintaan karena perlu menambahkan Interceptor seperti interseptor jaringan! Lihat: stackoverflow.com/a/36847027/2557258
Yazon2006
12

Berikut ini adalah Interceptoryang mencatat badan permintaan dan respons (menggunakan Timber, berdasarkan contoh dari dokumen OkHttp dan beberapa jawaban SO lainnya):

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";
        }
    }
}
david.mihola
sumber
6

Coba ini:

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

Setelah ini, di bodysana ada JSON yang Anda minati.

Anton Ryabyh
sumber
1
bagaimana cara mencetak respons tubuh?
Gilberto Ibarra
3
@GilbertoIbarra menggunakan String bodyString = response.body().string(); log(bodyString); response = response.newBuilder().body(ResponseBody.create(response.body().contentType(), bodyString)).build(); (Anda tidak dapat membaca tubuh respons lebih dari sekali, jadi Anda harus membuat respons baru dengan pembuat)
Anton Ryabyh
Itu kruk yang tidak kita butuhkan lagi. Berikut adalah contoh logging yang berhasil: stackoverflow.com/a/36847027/2557258
Yazon2006
6

Masalah utama yang saya hadapi adalah menambahkan dinamis header dan masuk ke debug logcat. Saya sudah mencoba menambahkan dua interceptor. Satu untuk masuk dan satu untuk menambahkan tajuk saat bepergian (otorisasi token). Masalahnya adalah bahwa kita mungkin .addInterceptor atau .addNetworkInterceptor. Seperti yang dikatakan Jake Wharton kepada saya: "Pencegat jaringan selalu datang setelah pencegat aplikasi. Lihat https://github.com/square/okhttp/wiki/Interceptors ". Jadi, inilah contoh yang berfungsi dengan header dan log:

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

Saya tidak tahu apakah setLogLevel () akan kembali dalam versi 2.0 final Retrofit tetapi untuk sekarang Anda dapat menggunakan interseptor untuk masuk.

Contoh yang baik dapat ditemukan di wiki OkHttp: 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();
Perasaan laut
sumber
Anda juga tidak membaca pertanyaan saya atau tidak membaca halaman yang Anda tautkan ... karena LoggingInterceptor tidak mencoba masuk ke badan permintaan (dan juga tidak menyelesaikan masalah saya)
Gabor
Saya mendapatkan 'UnsupportedOperationException'
Choletski
5

Jika Anda menggunakan Retrofit2 dan okhttp3 maka Anda perlu tahu bahwa Interceptor bekerja berdasarkan antrian. Jadi, tambahkan loggingInterceptor di bagian akhir, setelah Interceptor lainnya:

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();
NickUnuchek
sumber
4

Bagi mereka yang membutuhkan logging tingkat tinggi di Retrofit, gunakan interseptor seperti ini

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";
    }
}`

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

DGN
sumber
Anda seharusnya menyebutkan bahwa Anda menyalin dari github.com/square/retrofit/issues/1072# (untuk memberi kredit pada sumber Anda)
Gabor
Itu kruk yang tidak kita butuhkan lagi. Berikut adalah contoh logging yang berhasil: stackoverflow.com/a/36847027/2557258
Yazon2006
4

Kode Kotlin

        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)
Jorge Casariego
sumber
2

Anda juga dapat menambahkan Stetho Facebook dan melihat jejak jaringan di Chrome: http://facebook.github.io/stetho/

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

Lalu buka "chrome: // inspect" di Chrome ...

kenyee
sumber
2

ini akan membuat objek retrofit dengan Logging. tanpa membuat objek terpisah.

 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();
Jay Dangar
sumber
2

Pertama Tambahkan ketergantungan ke build.gradle:

implementasi 'com.squareup.okhttp3: logging-interceptor: 3.12.1'

Saat menggunakan Kotlin Anda dapat menambahkan Penerima Logging seperti ini:

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
    }
}
Vinay John
sumber
2

Set kode berikut berfungsi tanpa masalah bagi saya

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

Anda juga dapat memverifikasi hasilnya dengan masuk ke Tab Profiler di bagian bawah Android Studio, lalu mengklik tanda + untuk Mulai Sesi Baru, lalu pilih lonjakan yang diinginkan di "Jaringan". Di sana Anda bisa mendapatkan semuanya, tetapi rumit dan lambat. Silakan lihat gambar di bawah ini.

masukkan deskripsi gambar di sini

Naga api
sumber
1

Cara terbaik untuk melakukan ini dengan benar di Retrofit 2 adalah dengan menambahkan interseptor logger sebagai networkInterceptor ini akan mencetak header jaringan dan header kustom Anda juga. Yang penting adalah untuk mengingat bahwa pencegat bekerja sebagai tumpukan dan pastikan Anda menambahkan logger di akhir semua.

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());
Catluc
sumber
1

Sebagian besar jawabannya di sini mencakup hampir semua hal kecuali alat ini, salah satu cara paling keren untuk melihat log.

Ini adalah Facebook Stetho . Ini adalah alat yang luar biasa untuk memonitor / mencatat lalu lintas jaringan aplikasi Anda di google chrome . Anda juga dapat menemukan di sini pada Github.

masukkan deskripsi gambar di sini

Nishant Shah
sumber
1

untuk Retrofit 2.0.2 kodenya seperti

   **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();
        }
pria jangkung lainnya
sumber
1

Berikut adalah cara sederhana untuk memfilter setiap permintaan / tanggapan dari log menggunakan 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);

Inilah inti lengkapnya:

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

pulp_fiction
sumber
1

Saya juga terjebak dalam situasi yang serupa, setLevel()metode tidak datang, ketika saya mencoba menyebutnya dengan contoh HttpLoggingInterceptor, seperti ini:

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

Inilah cara saya mengatasinya, untuk menghasilkan log untuk Retrofit2,

Saya kira Anda telah menambahkan ketergantungan,

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

Untuk versi terbaru yang dapat Anda periksa, tautan ini:

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

Di sini mereka juga menjelaskan tentang cara menambahkan.

Saya membuat kelas dengan nama AddLoggingInterceptor, ini kode saya,

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

Lalu, di mana kita membuat Institusi kita,

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

Sekarang Anda dapat melihat log yang dihasilkan di Android Studio Anda, Anda mungkin perlu mencari, okHttpuntuk proses penyaringan. Ini berhasil untuk saya. Jika ada masalah, Anda dapat mengirim saya SMS di sini.

Jwala Kumar
sumber
0

Saya menemukan cara untuk Print Log di Retrofit

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

Bekerja untukku.

Nilesh Senta
sumber
0

Interceptor Retrofit adalah fitur hebat yang memungkinkan Anda bekerja dengan permintaan http. Ada dua jenis di antaranya: aplikasi dan pencegat jaringan.

Saya akan merekomendasikan untuk digunakan Charles Web Debugging Proxy Applicationjika Anda perlu mencatat permintaan / tanggapan Anda. Outputnya sangat mirip dengan Stetho tetapi itu adalah instrumen yang lebih kuat yang tidak perlu Anda tambahkan sebagai ketergantungan pada aplikasi.

yoAlex5
sumber
-11

hai teman-teman, saya sudah menemukan solusi:

  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);
}
Vihuela Yao
sumber
panggilan balik setLog dapat memasukkan setiap log
Vihuela Yao
1
ini menggunakan retrofit v1, bukan v2
Gabor