रेट्रोफिट 2 के साथ लॉगिंग


308

मैं उस सटीक JSON को प्राप्त करने का प्रयास कर रहा हूं जिसे अनुरोध में भेजा जा रहा है। यहाँ मेरा कोड है:

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

लेकिन मैं इसे केवल लॉग में देखता हूं:

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

मैं कैसे उचित लॉगिंग करने वाला हूं, जिसे हटाने setLog()और setLogLevel()जिसे हम रिट्रोफिट 1 के साथ उपयोग करते थे?

जवाबों:


697

Retrofit 2 में आपको HttpLoggingInterceptor का उपयोग करना चाहिए ।

के लिए निर्भरता जोड़ें build.gradle। अक्टूबर 2019 तक नवीनतम संस्करण है:

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

Retrofitनिम्नलिखित की तरह एक वस्तु बनाएँ :

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

पदावनति चेतावनियों के मामले में, बस इसमें बदलाव setLevelकरें:

interceptor.level(HttpLoggingInterceptor.Level.BODY);

उपरोक्त समाधान आपको लॉगसेट संदेश देता है जो पुराने सेट के समान है

setLogLevel(RestAdapter.LogLevel.FULL)

के मामले मेंjava.lang.ClassNotFoundException :

पुराने पुराना संस्करण को पुराने logging-interceptorसंस्करण की आवश्यकता हो सकती है । विवरण के लिए टिप्पणी अनुभागों पर एक नज़र डालें।


30
यह मेरे सवाल के ठीक 15 दिन बाद OkHttp में जोड़ा गया, अच्छा है कि समुदाय को इतनी जल्दी प्रभाव डालने की जरूरत है!
गबर

1
और अब आपको अपने build.gradle पर sonatype स्नैपशॉट रिपॉजिटरी को जोड़ने की आवश्यकता नहीं है
जेम्स गुडविन

13
रेट्रोफिट 2.1.0 इस संकलन का उपयोग करें 'com.squareup.okhttp3: logging-interceptor: 3.3.1'
jayellos

2
@jayellos को चिह्नित करने के लिए धन्यवाद। यदि आप 3.3.1 से कम संस्करण का उपयोग करते हैं, तो आपको ऐसी कोई विधि अपवाद नहीं मिलेगी।
guydemossyrock

2
मुझे मिल रहा है: कक्षा "okhttp3.internal.Platform" कोई विचार नहीं मिला?
corlaez

35

आपकी और मैं के बीच बात हुई, मैंने किताब के लेखक से पूछने की कोशिश की : रेट्रोफिट: एंड्रॉइड पर एपीआई के साथ काम करने वाला प्यार (यहां लिंक है ) (नहीं! मैं उनके लिए कुछ विज्ञापन नहीं कर रहा हूं .... लेकिन वे वास्तव में बहुत अच्छे हैं लोग :) और लेखक ने बहुत जल्द ही मुझे जवाब दिया, दोनों रीफ्रोइट 1.9 और रेट्रोफिट 2.0-बीटा पर लॉग विधि के साथ।

और यहाँ कोड २.०-बीटा रेट्रिट है:

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 की मदद से लॉगिंग विधि को जोड़ने का तरीका है । यदि आप उस पुस्तक के पाठक हैं, जिसका मैंने ऊपर उल्लेख किया है, तो आप पा सकते हैं कि यह कहती है कि रिट्रोफिट 2.0 के साथ कोई लॉग विधि नहीं है - जो, मैंने लेखक से पूछा था, यह सही नहीं है और वे अगले साल बात करते हुए पुस्तक को अपडेट करेंगे। इसके बारे में।

// यदि आप रेट्रोफिट में लॉग विधि से परिचित नहीं हैं, तो मैं कुछ और साझा करना चाहूंगा।

यह भी ध्यान दिया जाना चाहिए कि कुछ लॉगिंग स्तर हैं जिन्हें आप चुन सकते हैं। मैं ज्यादातर समय Level.BODY का उपयोग करता हूं , जो इस तरह से कुछ चीज देगा:

यहां छवि विवरण दर्ज करें

आप चित्र के अंदर लगभग सभी HTTP कर्मचारियों को पा सकते हैं: हेडर, सामग्री और प्रतिक्रिया, आदि।

और कभी-कभी आपको वास्तव में अपनी पार्टी में शामिल होने के लिए सभी मेहमानों की आवश्यकता नहीं होती है: मैं सिर्फ यह जानना चाहता हूं कि क्या यह सफलतापूर्वक जुड़ा हुआ है, कि इंटरनेट कॉल मेरे एक्टिविट एंड फ्रैग्मनेट के भीतर सफलतापूर्वक किया गया है। फिर आप Level.BASIC का उपयोग करने के लिए स्वतंत्र हैं , जो कुछ इस तरह लौटेगा:

यहां छवि विवरण दर्ज करें

क्या आप स्थिति कोड 200 ठीक अंदर पा सकते हैं ? बस इतना ही :)

इसके अलावा एक और है, Level.HEADERS , जो केवल नेटवर्क के हेडर को लौटाएगा। हां एक और तस्वीर यहाँ:

यहां छवि विवरण दर्ज करें

यह सब लॉगिंग ट्रिक है;)

और मैं आपको ट्यूटोरियल के साथ साझा करना चाहता हूं जो मैंने वहां बहुत कुछ सीखा है । उनके पास रिट्रॉफिट से संबंधित लगभग सभी चीजों के बारे में बात करने वाले महान पोस्ट का एक गुच्छा है, और वे पोस्ट को अपडेट करना जारी रख रहे हैं, उसी समय रेट्रोफिट 2.0 आ रहा है। कृपया उन कामों पर एक नज़र डालें, जो मुझे लगता है कि आपका बहुत समय बचाएंगे।


HttpLoggingInterceptor की उत्पत्ति कहाँ से हुई है?
रादु

5
इसके अलावा, यह मेरे लिए काम नहीं करता है। httpClient.interceptors.add एक com.squareup.okhttp.Interceptor चाहता है और एक okhttp3.logging.ttpLoggingInterceptor नहीं है
Radu

@Radu आप रेट्रोफिट के किस संस्करण पर हैं? आपके जोड़ में कुछ इस तरह होना चाहिए: संकलन 'com.squareup.retrofit2: retrofit: 2.0.0-beta4'
peitek

यह अनुरोध शीर्षलेखों को लॉग करने के लिए काम नहीं करेगा क्योंकि नेटवर्क इंटरसेप्टर की तरह इंटरसेप्टर को जोड़ना आवश्यक है! देखें: stackoverflow.com/a/36847027/2557258
Yazon2006

12

यहाँ एक Interceptorअनुरोध और प्रतिक्रिया निकाय दोनों लॉग हैं (OkHttp डॉक्स और कुछ अन्य SO उत्तरों से एक उदाहरण के आधार पर टिम्बर का उपयोग करते हुए):

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

इसे इस्तेमाल करे:

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

इसके बाद, bodyवहाँ JSON है जिसमें आप रुचि रखते हैं।


1
शरीर की प्रतिक्रिया को कैसे प्रिंट कर सकते हैं?
गिल्बर्टो इबारा

3
@ गिल्बर्टोइबार उपयोग String bodyString = response.body().string(); log(bodyString); response = response.newBuilder().body(ResponseBody.create(response.body().contentType(), bodyString)).build(); (आप एक से अधिक बार प्रतिक्रिया का शरीर नहीं पढ़ सकते हैं, इसलिए आपको बिल्डर के साथ नई प्रतिक्रिया बनानी होगी)
एंटोन रायबैह

यह एक बैसाखी है जिसकी हमें ज्यादा जरूरत नहीं है। यहाँ काम करने का एक उदाहरण है लॉगिंग: stackoverflow.com/a/36847027/2557258
Yazon2006

6

मुख्य समस्या जो मैंने सामना की वह थी डायनामिक हेडर जोड़ना और उन्हें डीबग लॉगकैट में लॉग करना। मैंने दो इंटरसेप्टर जोड़ने की कोशिश की है। लॉग-इन करने के लिए एक और ऑन-द-गो (टोकन प्राधिकरण) को जोड़ने के लिए एक। समस्या यह थी कि हम .addInterceptor या .addNetworkInterceptor कर सकते हैं। जैसा कि जेक व्हार्टन ने मुझसे कहा: "नेटवर्क इंटरसेप्टर हमेशा एप्लिकेशन इंटरसेप्टर के बाद आते हैं। https://github.com/square/okhttp/wiki/Interceptors देखें "। तो यहाँ हेडर और लॉग के साथ काम कर रहे उदाहरण है:

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

मुझे नहीं पता कि अगर सेटलॉगवेल () रेट्रोफिट के अंतिम 2.0 संस्करण में वापस आ जाएगा, लेकिन अभी के लिए आप लॉगिंग के लिए इंटरसेप्टर का उपयोग कर सकते हैं।

OkHttp wiki में एक अच्छा उदाहरण पाया जा सकता है: 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();

आपने या तो मेरा प्रश्न नहीं पढ़ा या उस पृष्ठ को नहीं पढ़ा जिसे आप लिंक कर रहे हैं ... क्योंकि LoggingInterceptor अनुरोध निकाय को लॉग करने का प्रयास नहीं करता है (और इसलिए मेरी समस्या का समाधान नहीं करता है)
Gabor

मुझे 'UnsupportedOperationException'
मिलती है

5

यदि आप Retrofit2 और okhttp3 का उपयोग कर रहे हैं तो आपको यह जानना होगा कि इंटरसेप्टर कतार द्वारा काम करता है। इसलिए अपने अन्य इंटरसेप्टर के बाद, अंत में loggingInterceptor जोड़ें:

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

जिन लोगों को रेट्रोफिट में उच्च स्तर की लॉगिंग की आवश्यकता होती है, वे इस तरह इंटरसेप्टर का उपयोग करें

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

सौजन्य : https://github.com/square/retrofit/issues/1072#


आपको यह उल्लेख करना चाहिए कि आपने github.com/square/retrofit/issues/1072# से कॉपी किया है (अपने स्रोत को क्रेडिट देने के लिए)
Gabor

यह एक बैसाखी है जिसकी हमें ज्यादा जरूरत नहीं है। यहाँ काम करने का एक उदाहरण है लॉगिंग: stackoverflow.com/a/36847027/2557258
Yazon2006

4

कोटलिन कोड

        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

आप फेसबुक के स्टेथो को भी जोड़ सकते हैं और क्रोम में नेटवर्क के निशान देख सकते हैं: http://facebook.github.io/betheth/

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

फिर क्रोम में "क्रोम: // निरीक्षण" खोलें ...


2

यह लॉगिंग के साथ एक रेट्रोफिट ऑब्जेक्ट बनाएगा। अलग-अलग ऑब्जेक्ट्स बनाने के बिना।

 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

पहले build.gradle पर निर्भरता जोड़ें:

कार्यान्वयन 'com.squareup.okhttp3: logging-interceptor: 3.12.1'

कोटलिन का उपयोग करते समय आप लॉगिंग इंटरसेप्टर को इस तरह जोड़ सकते हैं:

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

मेरे लिए किसी भी समस्या के बिना कोड का निम्नलिखित सेट काम कर रहा है

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

एंड्रॉइड स्टूडियो के निचले भाग में प्रोइलर टैब में जाकर कोई भी परिणाम सत्यापित कर सकता है, फिर + एक नया सत्र प्रारंभ करने के लिए + पर क्लिक करें और फिर "नेटवर्क" में वांछित स्पाइक का चयन करें। वहां आप सब कुछ प्राप्त कर सकते हैं, लेकिन यह बोझिल और धीमा है। कृपया नीचे चित्र देखें।

यहां छवि विवरण दर्ज करें


1

रेट्रोफ़िट 2 में इस अधिकार को करने का एक सबसे अच्छा तरीका है कि लॉगर इंटरसेप्टर को नेटवर्कइंटरसेप्टर के रूप में जोड़ा जाए, इससे नेटवर्क हेडर और आपके कस्टम हेडर भी प्रिंट हो जाएंगे। महत्वपूर्ण बात यह है कि इंटरसेप्टर एक स्टैक के रूप में याद रखें और सुनिश्चित करें कि आप सभी के अंत में लकड़हारा जोड़ सकते हैं।

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

यहां अधिकांश उत्तर इस उपकरण को छोड़कर लगभग सभी चीजों को शामिल करते हैं, लॉग को देखने के सबसे अच्छे तरीकों में से एक।

यह फेसबुक का स्टेथो है । यह Google क्रोम पर आपके ऐप के नेटवर्क ट्रैफ़िक की निगरानी / लॉग इन करने के लिए शानदार टूल है । आप यहां जीथब पर भी पा सकते हैं ।

यहां छवि विवरण दर्ज करें


1

Retrofit के लिए 2.0.2 कोड जैसा है

   **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

यहां लॉग का उपयोग करके किसी भी अनुरोध / प्रतिक्रिया पैरामेंट्स को फ़िल्टर करने का एक सरल तरीका है 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);

यहाँ पूर्ण जिस्ट है:

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


1

मैं भी इसी तरह की स्थिति में फंस गया था, setLevel()विधि नहीं आ रही थी, जब मैं इसे HttpLoggingInterceptor के उदाहरण के साथ कॉल करने की कोशिश कर रहा था, जैसे:

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

यहाँ मैंने इसे हल किया, Retrofit2 के लिए लॉग जनरेट करने के लिए,

मुझे लगता है कि आप भरोसेमंद जोड़ा है,

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

नवीनतम संस्करण के लिए आप इस लिंक को देख सकते हैं:

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

यहाँ उन्होंने यह भी बताया है कि कैसे जोड़ना है।

मैंने नाम के साथ एक वर्ग बनाया AddLoggingInterceptor, यहाँ मेरा कोड है,

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

फिर, जहां हम अपने रिट्रोफिट को तत्काल तैयार कर रहे हैं,

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

अब आप अपने एंड्रॉइड स्टूडियो में उत्पन्न लॉग देख सकते हैं, आपको okHttpफ़िल्टरिंग प्रक्रिया के लिए खोज करने की आवश्यकता हो सकती है। इसने मेरे लिए काम किया। यदि कोई समस्या है तो आप मुझे यहाँ पाठ कर सकते हैं।


0

मुझे रेट्रोफिट में प्रिंट लॉग के लिए रास्ता मिला

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

मेरे लिये कार्य करता है।


0

रिट्रोफिट का इंटरसेप्टर एक महान विशेषता है जो आपको http अनुरोधों के साथ काम करने की अनुमति देता है। उनमें से दो प्रकार हैं: एप्लिकेशन और नेटवर्क इंटरसेप्टर।

Charles Web Debugging Proxy Applicationयदि आपको आपके अनुरोध / प्रतिक्रियाओं को लॉग इन करने की आवश्यकता है, तो मैं उपयोग करने की सलाह दूंगा। आउटपुट स्टेथो के समान है, लेकिन यह अधिक शक्तिशाली उपकरण है जिसे आपको किसी एप्लिकेशन पर निर्भरता के रूप में जोड़ने की आवश्यकता नहीं है


-11

हे दोस्तों, मैं पहले से ही समाधान मिल:

  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 के कॉलबैक में हर लॉग इनपुट किया जा सकता है
Vihuela Yao

1
यह रेट्रोफिट v1 का उपयोग कर रहा है, v2 नहीं
गाबोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.