标签:拦截器 log AppContext 打印 网络日记 网络 添加 抓包 请求
0.如何显示网络请求日志
** 为什么要显示网络请求日志?**
开发中,经常会查看网络请求的信息,因为这样才能查看到网络请求错误,包括开发的时候,测试的时候,项目上线了可能都需要查看网络请求日志。
有哪些方法?
程序内部打印到控制台
这种方式,一般是开发中使用,就是通过网络请求框架打印,如果网络框架提供了这样的机制,那么实现就比较简单。
抓包
一般是开发中使用,还需要配置环境,稍微有点麻烦。
程序内部打印到手机
一般是测试,正式版中使用。
1.实现程序内打印网络日志
如何实现?
OkHttp提供了拦截器功能,简单来说,通过该机制,可以拦截网络请求前后,所以就可以在这里打印日志,具体的使用和原理,这里就不讲解了,因为比较复杂。
使用前没有添加这个依赖的,记得要添加上
//用来打印okhttp请求日志
//当然也可以自定义
implementation("com.squareup.okhttp3:logging-interceptor:4.2.0")
在创建完Okhttp实例后添加日记拦截器
public class Api {
....
/**
* 私有构造方法
*/
private Api() {
OkHttpClient.Builder okhttpClientBuilder = new OkHttpClient.Builder();
if (LogUtil.isDebug) {//是//调试模式的时候才添加拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
///设置日志等级
loggingInterceptor.level(HttpLoggingInterceptor.Level.BASIC);
//打印请求头
// loggingInterceptor.level(HttpLoggingInterceptor.Level.HEADERS);
//打印BODy
// loggingInterceptor.level(HttpLoggingInterceptor.Level.BODY);
//添加拦截器到OkHttpClient.Builder(添加到网络框架中)
okhttpClientBuilder.addInterceptor(loggingInterceptor);
}
}
从源码注释里面可以看出,控制台要打印出来的格式
测试
例如:请求歌单详情,对应BASIC日志等级:
D/OkHttp: --> GET http://dev-my-cloud-music-api-rails.ixuea.com/v1/sheets/1 http/1.1
D/OkHttp: <-- 200 OK http://dev-my-cloud-music-api-rails.ixuea.com/v1/sheets/1 (884ms, unknown-length body)
可以看到最基本的,能看到请求的地址,协议,响应状态码,时间等信息。
2. Stetho抓包
这种操作就是:**手机上的网络请求,在Chrome浏览器上显示出来。**
2.1 集成Stetho
前面的添加拦截器到控制台查看日记的方法,可以看到,有些数据太好查看(比如json数据过长,查看不太方便),所以需要借助其他方法。
什么是Stetho?
他是Facebook开源的一款基于Chrome的抓包工具,还可以查看布局等信息;因为使用其他抓包工具,还需要在手机上配置,而使用该工具抓包,只需要程序内部配置就行了。
缺点
这个可以理解为:这个抓包应用是依附在App的,App崩溃了,这个抓包应用也就连接不上了(这也是个弊端)
崩溃后,需要再次点击抓包,同时崩溃后看不到崩溃的网络请求。
这个依赖必须要要Okhttp依赖库才能正常运行
//通过OkHttp的拦截器机制
//实现在Chrome中抓包
//https://github.com/facebook/stetho
implementation 'com.facebook.stetho:stetho:1.5.1'
implementation 'com.facebook.stetho:stetho-okhttp3:1.5.1'
2.2 初始化Stetho抓包工具
AppContext 类
/**
* 全局Application
*/
public class AppContext extends Application {
// public class AppContext extends MultiDexApplication {
/**
* 上下文
*/
private static AppContext context;
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
//初始化MultiDex
MultiDex.install(this);
}
/**
* 创建了 (第一次创建应用或者杀掉应用后就会执行一次这个方法)
*/
@Override
public void onCreate() {
super.onCreate();
context = this;
//初始化toast工具类
Toasty.Config.getInstance().apply();
//初始化Toast工具类
ToastUtil.init(getApplicationContext());
//初始化Stetho抓包
//使用默认参数初始化
Stetho.initializeWithDefaults(this);
}
}
Api类添加 Stetho抓包拦截器
注意:下面用的是网络拦截器 addNetworkInterceptor
/**
* 私有构造方法
*/
private Api() {
OkHttpClient.Builder okhttpClientBuilder = new OkHttpClient.Builder();
if (LogUtil.isDebug) {//是//调试模式的时候才添加拦截器
//添加Stetho抓包拦截器(注意:addNetworkInterceptor,而不是addInterceptor)
okhttpClientBuilder.addNetworkInterceptor(new StethoInterceptor());
}
}
测试
确认项目能运行。
2.3 如何使用Chrome抓包
这种操作就是:手机上的网络请求,在Chrome浏览器上显示出来。
手机通过adb正常连接电脑。
使用Chrome打开
chrome://inspect/#devices
然后在Remote Targe中可以看到要抓包的应用,点击inspect,进入抓包界面(该界面第一次需要科学上网,过一段时间也要)。
查看网络请求
在Network页面中可以查看到网络请求,和Chrome抓网页请求包差不多。
3. 添加应用内网络检查器
前面的实现,基本上是要配合电脑才能使用,或者说只有开发人员使用才方便,但真实项目中,可能希望除开发外的人员(测试,产品等)也能在网络请求出错了,自己查看是什么错误,从而将Bug直接提交给相应的人,而不是,本来是后端问题,结果因为测试不确定是哪里的问题,就直接将Bug反馈给客户端开发人员了,而我们一查看后,还需要转给服务端人员;所以我们希望有一个工具,集成到客户端里面的,其他人员能直接在手机上查看网络请求,这样可以使用Chucker,他也是基于OkHttp拦截器来实现的。
添加依赖
//通过OkHttp的拦截器机制
//实现在应用内显示网络请求功能
//https://github.com/ChuckerTeam/chucker
//(所以我们希望有一个工具,集成到客户端里面的,其他人员能直接在手机上查看网络请求,
// 这样可以使用Chucker,他也是基于OkHttp拦截器来实现的;)
//debug:调试的时候才添加上,可以理解下面release那个依赖没有添加,理解为空实现
debugImplementation "com.github.ChuckerTeam.Chucker:library:3.0.1"
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:3.0.1"
安装依赖(同步请求)
测试
确认项目能运行。
Api类
/**
* 私有构造方法
*/
private Api() {
OkHttpClient.Builder okhttpClientBuilder = new OkHttpClient.Builder();
if (LogUtil.isDebug) {//是//调试模式的时候才添加拦截器
/**
* 前面的实现,基本上是要配合电脑才能使用,或者说只有开发人员使用才方便,但真实项目中,
* 可能希望除开发外的人员(测试,产品等)也能在网络请求出错了,
* 自己查看是什么错误,从而将Bug直接提交给相应的人,而不是,本来是后端问题,
* 结果因为测试不确定是哪里的问题,就直接将Bug反馈给客户端开发人员了,
* 而我们一查看后,还需要转给服务端人员;所以我们希望有一个工具,集成到客户端里面的,
* 其他人员能直接在手机上查看网络请求,这样可以使用Chucker,他也是基于OkHttp拦截器来实现的。
*/
//添加Chucker实现应用内显示网络请求信息拦截器
okhttpClientBuilder.addInterceptor(new ChuckerInterceptor(AppContext.getContext()));
}
}
上面用到的AppContext.getContext().
我们添加下
/**
* 全局Application
*/
public class AppContext extends Application {
// public class AppContext extends MultiDexApplication {
/**
* 上下文
*/
private static AppContext context;
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
//初始化MultiDex
MultiDex.install(this);
}
/**
* 创建了 (第一次创建应用或者杀掉应用后就会执行一次这个方法)
*/
@Override
public void onCreate() {
super.onCreate();
context = this
}
/**
* 获取当前上下文
*
* @return Context
*/
public static AppContext getContext() {
return context;
}
}
标签:拦截器,log,AppContext,打印,网络日记,网络,添加,抓包,请求 来源: https://blog.csdn.net/qq_40082314/article/details/109212396
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。