我使用Retrofit来发出Http请求和Json解析,我喜欢打开调试日志的方法。日志允许查看正文请求,网址...这非常有用。由于Retrofit使用OkHttp,我想知道OkHttp是否也有办法为每个请求启用日志。
答案 0 :(得分:24)
使用Interceptor
,您可以定义以下类:
class LoggingInterceptor implements Interceptor {
@Override public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
Log.d("OkHttp", String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
Log.d("OkHttp", String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
}
并添加它:
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.build();
答案 1 :(得分:13)
拦截器功能目前正在审核中,但您可以通过应用the pull request中的代码更改来构建自己的okHttp版本。
您可以使用此类
实现所需的功能// Create an interceptor which catches requests and logs the info you want
RequestInterceptor logRequests= new RequestInterceptor() {
public Request execute(Request request) {
Log.i("REQUEST INFO", request.toString());
return request; // return the request unaltered
}
};
OkHttpClient client = new OkHttpClient();
List<RequestInterceptor> requestInterceptors = client.requestInterceptors();
requestInterceptros.add(logRequests);
如果您想了解更多内容,A test会包含在拉取请求中。
我必须提前警告你使用它。拦截器API可能会有变化,因为它尚未合并。不要将它与生产代码一起使用,但它对于个人测试来说无害。
答案 2 :(得分:7)
还没有。但是正在开发的interceptors feature应该可以轻松实现。
答案 3 :(得分:3)
现在有一个Square(员工)的官方解决方案。 你可以试试: https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor
答案 4 :(得分:1)
对于okhttp3
HttpLoggingInterceptor logging = new HttpLoggingInterceptor(message -> Log.d(YourClass.class.getSimpleName(), "OkHttp: " + message));
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClient.getHttpClient().interceptors().add(logging);
答案 5 :(得分:0)
您可以启用日志记录功能并使用Timber进行整数化以仅在调试中进行记录。
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Timber.tag("OkHttp: ");
Timber.i(message);
}
}).setLevel(HttpLoggingInterceptor.Level.BODY);
client = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.build();
答案 6 :(得分:0)
为了更好地进行UI和OkHttp网络调用的调试,您可以使用 GANDER
之类的库其他功能包括:
使用Gander的应用程序将显示一条通知,显示正在进行的HTTP活动的摘要。轻按通知将启动完整的Gander UI。应用程序可以选择不显示通知,并直接在其自己的界面中启动Gander UI。 HTTP交互及其内容可以通过共享意图导出。
搜索HTTP活动以及请求和响应
答案 7 :(得分:0)
我添加了一些有关OkHttp3的信息,因为它支持从架子上注销。
首先,请确保同时具有这些依赖项,即OkHttp3主软件包和包含记录程序实现的特定软件包。在这里,我使用3.14.6
。
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.6</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>3.14.6</version>
</dependency>
然后正确设置您的OkHttp客户端。
...
import okhttp3.logging.HttpLoggingInterceptor;
...
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> logger.info(message));
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addNetworkInterceptor(interceptor)
.build();
主要思想是您必须向HttpLoggingInterceptor
解释如何记录,因此在上面的示例中,消息仅被路由到INFO
上的 Slf4j 记录器级别。