我在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();
编辑:这段代码现在可以工作了。我不知道为什么它不能早点工作。可能是因为我使用的是一些旧版本的翻新。
发布于 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应该很容易。我使用的是黑名单,但也可以根据您的需要使用白名单。
发布于 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();
发布于 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();
https://stackoverflow.com/questions/21886313
复制相似问题