রেট্রোফিট 2 দিয়ে লগ ইন করা হচ্ছে


308

আমি অনুরোধে প্রেরণ করা হচ্ছে সঠিক জেএসএন পাওয়ার চেষ্টা করছি। আমার কোডটি এখানে:

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

রিট্রোফিট 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
এবং আপনার আর আপনার বিল্ড.gradle এ সোন্যাটাইপ স্ন্যাপশট সংগ্রহের প্রয়োজন নেই
জেমস গুডউইন

13
retrofit 2.1.0 এই সংকলনটি 'com.squareup.okhttp3: লগিং-ইন্টারসেপ্টর: 3.3.1'
জায়েলোস

2
@ জেইল্লোস তা বোঝানোর জন্য ধন্যবাদ যদি আপনি ৩.৩.১ এর চেয়ে কম সংস্করণ ব্যবহার করেন তবে আপনি এ জাতীয় কোনও ব্যতিক্রম পাবেন না।
লোকডেমোসাইরক

2
আমি পাচ্ছি: "okhttp3.intern.Platform" ক্লাসটি কোনও ধারণা পেল না?
করলাজ

35

আমি আপনার মত জিনিসটির সাথে দেখা করেছি এবং আমি বইটির লেখক রেট্রোফিটকে জিজ্ঞাসা করার চেষ্টা করেছি : অ্যান্ড্রয়েডে এপিআইয়ের সাথে কাজ করা ভালবাসা (এখানে লিঙ্কটি দেওয়া হয়েছে ) (না! আমি তাদের জন্য কিছু বিজ্ঞাপন দিচ্ছি না .... তবে তারা সত্যিই দুর্দান্ত বলছি :) এবং লেখক খুব শিগগিরই আমাকে জবাব দিয়েছেন, রেট্রোফিট ১.৯ এবং রেট্রোফিট ২.০-বিটা উভয় লগ পদ্ধতিতে।

এবং এখানে রেট্রোফিট ২.০-বিটা কোড রয়েছে:

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

এইচটিপিএলপগিংইনটারসেপ্টরের সাহায্যে লগিং পদ্ধতিটি কীভাবে যুক্ত করা যায় । এছাড়াও আপনি যদি উপরে উল্লিখিত সেই বইটির পাঠক হন তবে আপনি দেখতে পাবেন যে এটি বলে যে রেট্রোফিট ২.০ এর সাথে লগের পদ্ধতি আর নেই - যা আমি লেখককে জিজ্ঞাসা করেছি, এটি সঠিক নয় এবং তারা পরের বছর কথা বলে বইটি আপডেট করবে এটি সম্পর্কে।

// আপনি যদি retrofit- এ লগ পদ্ধতির সাথে পরিচিত না হন তবে আমি আরও কিছু ভাগ করতে চাই।

এছাড়াও লক্ষ করা উচিত যে এখানে কিছু লগিং স্তর রয়েছে যা আপনি বেছে নিতে পারেন। আমি লেভেলটি ব্যবহার করি OD বেশিরভাগ সময় দেহ , যা এই জাতীয় কিছু দেবে:

এখানে চিত্র বর্ণনা লিখুন

আপনি ছবির ভিতরে থাকা সমস্ত http কর্মী খুঁজে পেতে পারেন: শিরোনাম, সামগ্রী এবং প্রতিক্রিয়া ইত্যাদি etc.

এবং কখনও কখনও আপনার পার্টিতে অংশ নেওয়ার জন্য সত্যই আপনার সমস্ত অতিথির প্রয়োজন হয় না: আমি কেবল এটি সফলভাবে সংযুক্ত কিনা তা জানতে চাই, সেই ইন্টারনেট কলটি আমার অ্যাক্টিআই এবং ফ্রেগমেটনে সফলভাবে করা হয়েছে। তারপরে আপনি লেভেল.ব্যাসিক ব্যবহার করতে মুক্ত , যা এরকম কিছু ফিরে আসবে:

এখানে চিত্র বর্ণনা লিখুন

আপনি কি ভিতরে 200 স্ট্যাটাস কোডটি খুঁজে পেতে পারেন ? হ্যাঁ, ওটাই :)

এছাড়াও আরও একটি রয়েছে, স্তর।হিডার্স , যা কেবলমাত্র নেটওয়ার্কের শিরোনামটি ফিরিয়ে দেবে। ইয়া অবশ্যই এখানে অন্য ছবি:

এখানে চিত্র বর্ণনা লিখুন

লগিংয়ের কৌশলটিই এটি;)

এবং আমি টিউটোরিয়াল আমি অনেক কিছু শিখেছি সঙ্গে আপনি ভাগ করে নিতে চাই সেখানে । তাদের কাছে রেট্রোফিট সম্পর্কিত প্রায় সমস্ত কিছু নিয়ে দুর্দান্ত একটি পোস্ট রয়েছে এবং তারা পোস্টটি আপডেট করে চলেছে, একই সময়ে retrofit 2.0 আসছে। দয়া করে সেই কাজগুলি একবার দেখুন, যা আমি মনে করি আপনাকে অনেক সময় সাশ্রয় করবে।


কোথা থেকে এইচটিপিএলগিংইন্টারসেপ্টারের উত্স?
রাদু

5
এছাড়াও, এটি আমার পক্ষে কাজ করে না। httpClient.interceptors.add একটি com.squareup.okhttp.Interceptor চায় এবং একটি okhttp3.logging.HttpLoggingInterceptor
Radu

@ রাদু আপনি রেট্রোফিটের কোন সংস্করণটি চালু করছেন? আপনার গ্রেডে এর মতো কিছু হওয়া উচিত: 'কম.স্যাকয়ারআপ.রেট্রোফিট 2: retrofit: 2.0.0-beta4'
পিইটেক

অনুরোধ শিরোনাম লগ করার জন্য এটি কাজ করবে না কারণ নেটওয়ার্ক ইন্টারসেপ্টারের মতো ইন্টারসেপ্টর যুক্ত করা প্রয়োজন! দেখুন: 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সেখানে আপনি আগ্রহী জেএসওএন রয়েছে।


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। হিসাবে জেক হোয়ারটন আমাকে বললেন: "নেটওয়ার্ক interceptors খুব সবসময় আবেদন interceptors খুব পরে আসা দেখুন। 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

আমি জানি না সেটলগলিভেল () retrofit এর চূড়ান্ত 2.0 সংস্করণে ফিরে আসবে কিনা তবে আপাতত আপনি লগিংয়ের জন্য একটি ইন্টারসেপ্টর ব্যবহার করতে পারেন।

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

আপনি হয় আমার প্রশ্নটি পড়েননি বা আপনি যে পৃষ্ঠায় লিঙ্ক করছেন সে পৃষ্ঠাগুলি পড়েন নি ... কারণ লগিংইন্টারসেপ্টর অনুরোধের বডিটিতে লগ করার চেষ্টা করে না (এবং তাই আমার সমস্যার সমাধান করে না)
গ্যাবর

আমি 'অসমর্থিত
অপারেশন এক্সপেশন

5

আপনি যদি retrofit2 এবং okhtt 3G ব্যবহার করছেন তবে আপনার জানতে হবে যে ইন্টারসেপ্টর কাতারে কাজ করে। সুতরাং আপনার অন্যান্য ইন্টারসেপ্টরের পরে, শেষে লগিং ইন্টারসেপ্টার যুক্ত করুন:

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# (আপনার উৎস কৃতিত্ব দিতে)
নেই Gábor

এটি ক্রাচ যা আমাদের বেশি প্রয়োজন হয় না। এখানে কাজ লগিং একটি উদাহরণ 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/stetho/

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

তারপরে Chrome এ "ক্রোম: // পরিদর্শন করুন" খুলুন ...


2

এটি লগিংয়ের সাথে একটি retrofit অবজেক্ট তৈরি করবে। পৃথক অবজেক্ট তৈরি না করে।

 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: লগিং-ইন্টারসেপ্টর: 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-এ এটি করার সর্বোত্তম উপায় হ'ল একটি নেটওয়ার্ক হিসাবে লগার ইন্টারসেপ্টর যুক্ত করা or গুরুত্বপূর্ণ বিষয়টি মনে রাখতে হবে যে ইন্টারসেপ্টর একটি স্ট্যাক হিসাবে কাজ করে এবং নিশ্চিত হয়ে যায় যে আপনি সব শেষে লগার যুক্ত করেছেন।

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

এখানে বেশিরভাগ উত্তরে এই সরঞ্জামটি ব্যতীত প্রায় সমস্ত কিছু অন্তর্ভুক্ত থাকে, লগটি দেখার অন্যতম দুর্দান্ত উপায় ways

এটি ফেসবুকের স্টেথোগুগল ক্রোমে আপনার অ্যাপ্লিকেশনটির নেটওয়ার্ক ট্র্যাফিক নিরীক্ষণ / লগ করার জন্য এটি দুর্দান্ত এক সরঞ্জাম । আপনি গিথুব এ এখানেও পেতে পারেন ।

এখানে চিত্র বর্ণনা লিখুন


1

retrofit 2.0.2 এর জন্য কোডটি এর মতো is

   **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 loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

এখানে আমি কীভাবে এটি সমাধান করেছি, রেট্রোফিট 2-এর জন্য লগ তৈরি করতে,

আমি মনে করি আপনি নির্ভরশীলতা যুক্ত করেছেন,

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

সর্বশেষতম সংস্করণটির জন্য আপনি এই লিঙ্কটি পরীক্ষা করে দেখতে পারেন:

https://github.com/square/okhttp/tree/master/okhttp-logging-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আপনার অনুরোধগুলি / প্রতিক্রিয়াগুলিতে লগিংয়ের প্রয়োজন হলে । আউটপুটটি স্টেথোর মতোই তবে এটি একটি আরও শক্তিশালী উপকরণ যা আপনাকে কোনও অ্যাপ্লিকেশনের নির্ভরতা হিসাবে যুক্ত করতে হবে না do


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

সেটলগের কলব্যাক প্রতিটি লগ ইনপুট করতে পারে
বিহুওলা ইয়াও

1
এটি v2 নয়, retrofit v1 ব্যবহার করছে
গাবোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.