首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Retrofit-Android记录请求和响应正文?

如何使用Retrofit-Android记录请求和响应正文?
EN

Stack Overflow用户
提问于 2014-02-20 00:22:38
回答 6查看 144.2K关注 0票数 141

我在Retrofit API中找不到用于记录完整请求/响应主体的相关方法。我期待Profiler中的一些帮助(但它只提供关于响应的元数据)。我尝试在Builder中设置日志级别,但这对我也没有帮助:

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

编辑:这段代码现在可以工作了。我不知道为什么它不能早点工作。可能是因为我使用的是一些旧版本的翻新。

EN

回答 6

Stack Overflow用户

发布于 2015-02-26 01:52:54

似乎没有一种方法可以做basic + body,但你可以使用FULL并过滤你不想要的标题。

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 ]

因此,通过调整自定义筛选器来记录basic + body应该很容易。我使用的是黑名单,但也可以根据您的需要使用白名单。

票数 9
EN

Stack Overflow用户

发布于 2019-03-18 14:34:57

我希望这段代码能帮助你记录日志。

你只需要在你的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(); 
票数 3
EN

Stack Overflow用户

发布于 2016-09-20 16:43:20

如果你正在使用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))
                .addInterceptor(new OAuthInterceptor(context))
                .authenticator(new BearerTokenAuthenticator(context))
                .addInterceptor(loggingInterceptor)//at the end
                .build();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21886313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档