我正在尝试获取请求中发送的确切JSON . 这是我的代码:
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
鉴于删除了我们曾经用于改造1的 setLog()
和 setLogLevel()
,我该如何进行正确的记录?
16 回答
在Retrofit 2中你应该使用HttpLoggingInterceptor .
将依赖项添加到
build.gradle
:创建一个
Retrofit
对象,如下所示:上面的解决方案为您提供了非常类似于旧设置的logcat消息
In case of java.lang.ClassNotFoundException :
较旧的Retrofit版本可能需要较旧的
logging-interceptor
版本 . 有关详细信息,请查看注释部分 .我遇到了你的事情,我试图问这本书的作者 Retrofit: Love working with APIs on Android (这里是link)(不!我不是为他们制作一些广告......但是他们真的很好人:)而且作者回答说对我来说很快,使用Retrofit 1.9上的Log方法和Retrofit 2.0-beta .
以下是Retrofit 2.0-beta的代码:
这是在 HttpLoggingInterceptor 的帮助下添加日志记录方法的方法 . 另外,如果你是我上面提到的那本书的读者,你可能会发现它说再没有使用Retrofit 2.0的日志方法了 - 我曾经问过作者,这是不正确的,明年他们会更新这本书关于它 .
//如果您不熟悉Retrofit中的Log方法,我想分享更多内容 .
还应注意,您可以选择一些日志级别 . 我大部分时间都使用 Level.BODY ,它会给出一些这样的东西:
您可以在图片中找到几乎所有的http人员: Headers ,内容和响应等 .
有时你真的没有成功连接,在我的Activiy&Fragmetn中成功完成了互联网通话 . 然后你可以自由使用 Level.BASIC ,它将返回如下内容:
你能在里面找到状态码 200 OK 吗?这就对了 :)
还有另一个, Level.HEADERS ,它只返回网络的 Headers . 雅当然另一张图片在这里:
这就是所有的记录技巧;)
我想与大家分享一下there . 他们有很多很棒的帖子谈论与Retrofit相关的几乎所有内容,他们正在继续更新帖子,同时Retrofit 2.0即将推出 . 请看一下这些工作,我认为这将为您节省大量时间 .
这是一个记录请求和响应主体的
Interceptor
(使用Timber,基于OkHttp文档中的示例和其他一些SO答案):试试这个:
在此之后,在
body
中有您感兴趣的JSON .我不知道setLogLevel()是否会在Retrofit的最终2.0版本中返回,但是现在你可以使用拦截器进行日志记录 .
可以在OkHttp wiki中找到一个很好的例子:https://github.com/square/okhttp/wiki/Interceptors
对于那些需要在Retrofit中进行高级别日志记录的人,请使用这样的拦截器
Courtesy :https://github.com/square/retrofit/issues/1072#
我面临的主要问题是动态添加标头并将其记录到调试logcat中 . 我试图添加两个拦截器 . 一个用于记录,一个用于在移动中添加标头(令牌授权) . 问题是我们可能是.addInterceptor或.addNetworkInterceptor . 正如杰克沃顿对我说的那样:“网络拦截器总是在应用拦截器之后出现 . 请参阅https://github.com/square/okhttp/wiki/Interceptors” . 所以这里是 Headers 和日志的工作示例:
如果您使用的是Retrofit2和okhttp3,那么您需要知道Interceptor是按队列工作的 . 所以在你的其他拦截器之后添加loggingInterceptor:
您还可以添加Facebook的Stetho并查看Chrome中的网络跟踪:http://facebook.github.io/stetho/
然后在Chrome中打开“chrome:// inspect”...
在Retrofit 2中执行此操作的最佳方法是将logger拦截器添加为networkInterceptor,这将打印出网络标头和您的自定义标头 . 重要的是要记住拦截器作为堆栈工作,并确保在最后添加 Logger .
这里的大部分答案几乎涵盖了除此工具之外的所有内容,这是查看日志的最酷方式之一 .
这是Facebook's Stetho . 这是在 google chrome 上监控/记录应用程序网络流量的绝佳工具 . 你也可以找到hereGithub上 .
我找到了改造打印日志的方法
适合我 .
对于Retrofit 2.0.2,代码就像
Kotlin Code
这将使用Logging创建一个改进对象 . 不创建单独的对象 .
嘿伙计们,我已经找到了解决办法: