কীভাবে অনুরোধ এবং রেট্রোফিট-অ্যান্ড্রয়েডের সাথে প্রতিক্রিয়ার বডি লগ করবেন?


129

সম্পূর্ণ অনুরোধ / প্রতিক্রিয়া সংস্থাগুলি লগ করার জন্য আমি retrofit API এ প্রাসঙ্গিক পদ্ধতিগুলি খুঁজে পাচ্ছি না। আমি প্রোফাইলারটিতে কিছু সহায়তা আশা করছিলাম (তবে এটি প্রতিক্রিয়া সম্পর্কে কেবল মেটা-ডেটা সরবরাহ করে)। আমি বিল্ডারে লগ স্তর নির্ধারণ করার চেষ্টা করেছি, তবে এটি আমাকেও সহায়তা করে না:

RestAdapter adapter = (new RestAdapter.Builder()).
                setEndpoint(baseUrl).
                setRequestInterceptor(interceptor).
                setProfiler(profiler).
                setClient(client).
                setExecutors(MyApplication.getWebServiceThreadPool()).
                setLogLevel(LogLevel.FULL).
                setLog(new RestAdapter.Log() {
                    @Override
                    public void log(String msg) {
                        Log.i(TAG, msg);
                    }
                }).
                build();

সম্পাদনা: এই কোডটি এখন কাজ করছে। আমি জানি না কেন এটি আগে কাজ করছিল না। সম্ভবত আমি retrofit এর কিছু পুরানো সংস্করণ ব্যবহার করছিলাম কারণ।


আপনি কি কখনও এটি খুঁজে বের করতে পারেন? ডকুমেন্টেশন বলছে যে FULLএটি দেহ দেবে বলে মনে করা হচ্ছে তবে এটি মনে হয় না।
theblang

1
@ ম্যাটব্ল্যাং: আমি জানি না আগে কী ভুল হয়েছিল, তবে এই কোডটি এখন কাজ করছে।
জাগুয়ার



সম্ভবত তাত্ক্ষণিকভাবে রান
গণ্ডগোল

উত্তর:


91

আমি ব্যবহার করেছি setLogLevel(LogLevel.FULL).setLog(new AndroidLog("YOUR_LOG_TAG")), এটি আমাকে সাহায্য করেছিল।
হালনাগাদ.
আপনি retrofit.client.Responseপ্রতিক্রিয়া মডেল হিসাবে ডিবাগ উদ্দেশ্যে ব্যবহারের চেষ্টা করতে পারেন


2
AndroidLog, এটা কোন ক্লাস?
theblang

এটি রেট্রোফিট লাইব্রেরি সহ আসে।
অ্যালেক্স জেজকো

2
আমি দেখি. দুর্ভাগ্যক্রমে এটি আপনাকে দেয় না response body, যদিও এটি দস্তাবেজের মধ্যে উল্লেখ করে যা আপনাকে দেওয়া LogLevel.FULL উচিতresponse body
theblang

এটি ভার্জোজ ট্যাবের অধীনে অ্যান্ড্রয়েড লগকটে "YOUR_LOG_TAG" এর সাথে দেখা যেতে পারে।
রাজেশ

4
লগলিভেল.ফুলটি 2 টি পুনর্নির্মাণে নেই

121

Retrofit 2.0 :

আপডেট: @ মার্কাস পাহ্লস এর মাধ্যমে

রেট্রোফিট 2 এ লগ ইন করা

রেট্রোফিট 2 কোনও নেটওয়ার্ক ক্রিয়াকলাপের জন্য OkHttp এ সম্পূর্ণ নির্ভর করে। যেহেতু OkHttp রিট্রোফিট 2 এর পিয়ার নির্ভরতা, তাই রেট্রোফিট 2 স্থিতিশীল প্রকাশ হিসাবে প্রকাশিত হওয়ার পরে আপনাকে অতিরিক্ত নির্ভরতা যুক্ত করতে হবে না।

অভ্যন্তরীণ নির্ভরতা হিসাবে লগিং ইন্টারসেপ্টারের সাথে OkHttp 2.6.0 জাহাজগুলি পাঠানো হয় এবং আপনি এটি সরাসরি আপনার retrofit ক্লায়েন্টের জন্য ব্যবহার করতে পারেন। Retrofit 2.0.0-beta2 এখনও OkHttp 2.5.0 ব্যবহার করে। ভবিষ্যতের প্রকাশগুলি উচ্চতর ওএইচটিটিপি সংস্করণগুলির নির্ভরতাকে ঘায়েল করবে। এজন্য আপনাকে ম্যানুয়ালি লগিং ইন্টারসেপ্টর আমদানি করতে হবে। লগিং ইন্টারসেপটর নির্ভরতা আনতে আপনার বিল্ড.gradle ফাইলের মধ্যে আপনার গ্রেড আমদানিতে নিম্নলিখিত লাইনটি যুক্ত করুন।

compile 'com.squareup.okhttp3:logging-interceptor:3.9.0'

আপনি এই ইন্টারসেপ্টর সম্পর্কে স্কয়ারের গিটহাব পৃষ্ঠাটিও দেখতে পারেন

পুনঃনির্মাণ 2 এ লগিং যুক্ত করুন

আপনার অ্যাপ্লিকেশন বিকাশ করার সময় এবং ডিবাগিংয়ের উদ্দেশ্যে অনুরোধ এবং প্রতিক্রিয়া সম্পর্কিত তথ্য প্রদর্শন করার জন্য একটি লগ বৈশিষ্ট্য সংহত করা ভাল। যেহেতু লগিং আর্ট্রোফিট 2 এ আর ডিফল্টরূপে সংহত হয় না, তাই আমাদের OkHttp এর জন্য একটি লগিং ইন্টারসেপ্টর যুক্ত করা দরকার। ভাগ্যক্রমে OkHttp ইতিমধ্যে এই ইন্টারসেপ্টারের সাথে পাঠায় এবং আপনার কেবল এটি আপনার OkHttpClient এর জন্য সক্রিয় করা দরকার।

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();  
// set your desired log level
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();   
// add your other interceptors …
// add logging as last interceptor
httpClient.addInterceptor(logging);  // <-- this is the important line!
Retrofit retrofit = new Retrofit.Builder()  
        .baseUrl(API_BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .client(httpClient.build())
        .build();

আমরা সর্বশেষ ইন্টারসেপ্টার হিসাবে লগিং যুক্ত করার পরামর্শ দিই, কারণ এটি আপনার অনুরোধে পূর্ববর্তী ইন্টারসেপ্টরগুলির সাথে যোগ করা তথ্য লগও করবে।

লগ স্তর

অত্যধিক তথ্য লগ করা আপনার অ্যান্ড্রয়েড মনিটরকে ফুটিয়ে তুলবে, এ কারণেই OkHttp এর লগিং ইন্টারসেপ্টারে চারটি লগ স্তর রয়েছে: কোন, বেসিক, শিরোনাম, দেহ। আমরা আপনাকে প্রতিটি লগ স্তরের মধ্য দিয়ে চলব এবং তাদের আউটপুট বর্ণনা করব।

আরও তথ্য দয়া করে দেখুন: retrofit 2 - লগ অনুরোধ এবং প্রতিক্রিয়া

পুরানো উত্তর:

আর রেট্রোফিট 2 এ আর লগইন নেই। বিকাশকারী দলটি লগিংয়ের বৈশিষ্ট্যটি সরিয়ে দিয়েছে। সত্যি কথা বলতে গেলে লগিং বৈশিষ্ট্যটি যাইহোক নির্ভরযোগ্য ছিল না। জ্যাক ওয়ার্টন স্পষ্টভাবে বলেছিলেন যে লগ করা বার্তা বা বস্তুগুলি অনুমান করা মান এবং সেগুলি সত্য বলে প্রমাণিত হতে পারে না। প্রকৃত অনুরোধটি যা সার্ভারে আসে তার পরিবর্তিত অনুরোধের বডি বা অন্য কিছু থাকতে পারে।

ডিফল্টরূপে কোনও সংহত লগিং না থাকা সত্ত্বেও, আপনি যেকোন জাভা লগার উপার্জন করতে পারেন এবং এটি কোনও কাস্টমাইজড OkHttp ইন্টারসেপ্টারের মধ্যে ব্যবহার করতে পারেন।

রেট্রোফিট 2 সম্পর্কে আরও তথ্য দয়া করে উল্লেখ করুন: রেট্রোফিট - শুরু করা এবং একটি Android ক্লায়েন্ট তৈরি করুন



যা কিছু হওয়া উচিত তার চেয়ে আরও জটিল করার দুর্দান্ত উপায়। জার্সি 1 বনাম জার্সি 2 লগিংয়ের কথা মনে করিয়ে দেয়। আরও বয়লারপ্লেট কোড ....
ব্রেকলাইন

এইভাবে ইন্টারসেপ্টর যুক্ত করার ফলে এখন OkHttp v3 এ একটি অসমর্থিত অপেশান এক্সেকশন হবে। নতুন উপায়টি হ'ল: OkHttpClient.Builder ()। AddInterceptor (লগিং)। বিল্ড () github.com/square/okhttp/issues/2219
Amagi82

@ জাওয়াদলিউয়াদী হ্যাঁ এই কোডটি ব্যবহার করে আপনি বডিটি মুদ্রণ করতে পারবেন
ধাওয়াল জবানী

রেট্রোফিট 2 জন্য, এই অনেক সহজ।
গ্যারি 99

31

Retrofit 2.0.0-beta3 এর জন্য আপডেট

এখন আপনাকে বিল্ডারের সাথে okhttp3 ব্যবহার করতে হবে। এছাড়াও পুরানো ইন্টারসেপ্টার কাজ করবে না। এই প্রতিক্রিয়াটি অ্যান্ড্রয়েডের জন্য উপযুক্ত।

নতুন স্টাফ সহ আপনার জন্য এখানে একটি দ্রুত অনুলিপি পেস্ট।

1. আপনার গ্রেড ফাইল এতে পরিবর্তন করুন

  compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3'
  compile "com.squareup.retrofit2:converter-gson:2.0.0-beta3"
  compile "com.squareup.retrofit2:adapter-rxjava:2.0.0-beta3"
  compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'

2. এই নমুনা কোডটি পরীক্ষা করুন:

নতুন আমদানি সহ। আপনি আরএক্স অপসারণ করতে পারেন যদি আপনি এটি ব্যবহার না করেন তবে যা ব্যবহার করেন না তা সরিয়েও দিতে পারেন।

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.GsonConverterFactory;
import retrofit2.Retrofit;
import retrofit2.RxJavaCallAdapterFactory;
import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;

public interface APIService {

  String ENDPOINT = "http://api.openweathermap.org";
  String API_KEY = "2de143494c0b2xxxx0e0";

  @GET("/data/2.5/weather?appid=" + API_KEY) Observable<WeatherPojo> getWeatherForLatLon(@Query("lat") double lat, @Query("lng") double lng, @Query("units") String units);


  class Factory {

    public static APIService create(Context context) {

      OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
      builder.readTimeout(10, TimeUnit.SECONDS);
      builder.connectTimeout(5, TimeUnit.SECONDS);

      if (BuildConfig.DEBUG) {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
        builder.addInterceptor(interceptor);
      }

      //Extra Headers

      //builder.addNetworkInterceptor().add(chain -> {
      //  Request request = chain.request().newBuilder().addHeader("Authorization", authToken).build();
      //  return chain.proceed(request);
      //});

      builder.addInterceptor(new UnauthorisedInterceptor(context));
      OkHttpClient client = builder.build();

      Retrofit retrofit =
          new Retrofit.Builder().baseUrl(APIService.ENDPOINT).client(client).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();

      return retrofit.create(APIService.class);
    }
  }
}

বোনাস

আমি জানি এটি অফটোপিক তবে এটি আমার কাছে দুর্দান্ত লাগছে।

যদি অননুমোদিতের কোনও HTTP ত্রুটি কোড থাকে তবে এখানে একটি ইন্টারসেপ্টর রয়েছে। আমি ইভেন্টটি সঞ্চার করার জন্য ইভেন্টবাস ব্যবহার করি।

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import com.androidadvance.ultimateandroidtemplaterx.BaseApplication;
import com.androidadvance.ultimateandroidtemplaterx.events.AuthenticationErrorEvent;

import de.greenrobot.event.EventBus;
import java.io.IOException;
import javax.inject.Inject;
import okhttp3.Interceptor;
import okhttp3.Response;

public class UnauthorisedInterceptor implements Interceptor {

  @Inject EventBus eventBus;

  public UnauthorisedInterceptor(Context context) {
    BaseApplication.get(context).getApplicationComponent().inject(this);
  }

  @Override public Response intercept(Chain chain) throws IOException {
    Response response = chain.proceed(chain.request());
    if (response.code() == 401) {
      new Handler(Looper.getMainLooper()).post(() -> eventBus.post(new AuthenticationErrorEvent()));
    }
    return response;
  }
}

কোড https://github.com/AndreiD/UltimateAndroidTemplateRx (আমার প্রকল্প) থেকে নেওয়া ।


9

বেসিক + বডি করার কোনও উপায় আছে বলে মনে হয় না তবে আপনি পুরোটি ব্যবহার করতে পারেন এবং যে শিরোনামগুলি আপনি চান না তা ফিল্টার করতে পারেন।

RestAdapter adapter = new RestAdapter.Builder()
                          .setEndpoint(syncServer)
                          .setErrorHandler(err)
                          .setConverter(new GsonConverter(gson))
                          .setLogLevel(logLevel)
                          .setLog(new RestAdapter.Log() {
                              @Override
                              public void log(String msg) {
                                  String[] blacklist = {"Access-Control", "Cache-Control", "Connection", "Content-Type", "Keep-Alive", "Pragma", "Server", "Vary", "X-Powered-By"};
                                  for (String bString : blacklist) {
                                      if (msg.startsWith(bString)) {
                                          return;
                                      }
                                  }
                                  Log.d("Retrofit", msg);
                              }
                          }).build();

এটি প্রদর্শিত হয় যে লগটি ওভাররাইড করার সময়, দেহটির অনুরূপ একটি ট্যাগ সহ উপসর্গ করা হয়

[ 02-25 10:42:30.317 25645:26335 D/Retrofit ]

সুতরাং কাস্টম ফিল্টারটি সামঞ্জস্য করে বেসিক + বডি লগ করা সহজ হওয়া উচিত। আমি একটি কালো তালিকা ব্যবহার করছি, তবে আপনার প্রয়োজনের উপর নির্ভর করে একটি শ্বেত তালিকাও ব্যবহার করা যেতে পারে।


4

নীচের কোড লগের অনুরোধ এবং প্রতিক্রিয়া মুদ্রণের জন্য শিরোলেখ সহ এবং শিরোনাম ছাড়া উভয়ের জন্য কাজ করছে। দ্রষ্টব্য: হেডার ব্যবহার না করে থাকলে .addHeader () লাইনটি কেবলমাত্র মন্তব্য করুন।

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                //.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
                .addNetworkInterceptor(new Interceptor() {

                    @Override

                    public okhttp3.Response intercept(Chain chain) throws IOException {
                        Request request = chain.request().newBuilder()
                                // .addHeader(Constant.Header, authToken)
                                   .build();
                        return chain.proceed(request);
                    }
                }).build();

        final Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constant.baseUrl)
                .client(client) // This line is important
                .addConverterFactory(GsonConverterFactory.create())
                .build();

3

আমি আশা করি এই কোডটি আপনাকে লগ ইন করতে সহায়তা করবে।
আপনার কেবলমাত্র Build.Gradleতখনই আপনার বিরতি যুক্ত করতে হবে RetrofitClient

প্রথম ধাপ

আপনার এই লাইন যুক্ত করুন build.gradle

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

দ্বিতীয় ধাপ

আপনার retrofit ক্লায়েন্ট করুন


   public class RetrofitClient {

    private Retrofit retrofit;
    private static OkHttpClient.Builder httpClient =
            new OkHttpClient.Builder();
    private static RetrofitClient instance = null;
    private static ApiServices service = null;
    private static HttpLoggingInterceptor logging =
            new HttpLoggingInterceptor();

    private RetrofitClient(final Context context) {
        httpClient.interceptors().add(new Interceptor() {
            @Override
            public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException {
                Request originalRequest = chain.request();
                Request.Builder builder = originalRequest.newBuilder().
                        method(originalRequest.method(), originalRequest.body());
                okhttp3.Response response = chain.proceed(builder.build());
                /*
                Do what you want
                 */
                return response;
            }
        });

        if (BuildConfig.DEBUG) {
            logging.setLevel(HttpLoggingInterceptor.Level.BODY);
            // add logging as last interceptor
            httpClient.addInterceptor(logging);
        }

        retrofit = new Retrofit.Builder().client(httpClient.build()).
                baseUrl(Constants.BASE_URL).
                addConverterFactory(GsonConverterFactory.create()).build();
        service = retrofit.create(ApiServices.class);
    }


    public static RetrofitClient getInstance(Context context) {
        if (instance == null) {
            instance = new RetrofitClient(context);
        }
        return instance;
    }

    public ApiServices getApiService() {
        return service;
    }
}

কল করা হচ্ছে

RetrofitClient.getInstance(context).getApiService().yourRequestCall(); 

2

আপনি যদি 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))
                .addInterceptor(new OAuthInterceptor(context))
                .authenticator(new BearerTokenAuthenticator(context))
                .addInterceptor(loggingInterceptor)//at the end
                .build();


0

3.0 এর আগে অ্যান্ড্রয়েড স্টুডিওর জন্য (অ্যান্ড্রয়েড মোটিনর ব্যবহার করে)
https://futurestud.io/tutorials/retrofit-2-log-requests-and-responses
https://www.youtube.com/watch?v=vazLpzE5y9M

আর 3.0 এবং উপরে থেকে অ্যান্ড্রয়েড স্টুডিও জন্য (ব্যবহার করে Android মনিটর হিসাবে অ্যান্ড্রয়েড প্রোফাইলার অ্যান্ড্রয়েড প্রোফাইলার দ্বারা প্রতিস্থাপিত হয়)
https://futurestud.io/tutorials/retrofit-2-analyze-network-traffic-with-android-studio-profiler

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