本文使用的OkHttp版本是okhttp3,使用okhttp2的情况稍有不同,使用okhttp2的同学替换为okhttp3也不麻烦,API都很接近;当然,如果想要使用okhttp2使用stetho & 拦截器也是可以的,可以参考官方文档。
先贴出Gradle依赖,基本上我使用的都是最新版本的库。
def okhttp3Version = '3.4.1'
compile('com.squareup.okhttp3:okhttp:' + okhttp3Version)
compile('com.squareup.okhttp3:logging-interceptor:' + okhttp3Version)
testCompile('com.squareup.okhttp3:mockwebserver:' + okhttp3Version)
compile 'com.facebook.stetho:stetho-okhttp3:1.3.1'

1. 定义一个全局的OkHttp请求单例类,全局统一使用单一OkHttpClient:

/** * 全局统一使用的OkHttpClient工具,okhttp版本:okhttp3 */
public class OkHttpUtils {    public static final long DEFAULT_READ_TIMEOUT_MILLIS = 15 * 1000;    public static final long DEFAULT_WRITE_TIMEOUT_MILLIS = 20 * 1000;    public static final long DEFAULT_CONNECT_TIMEOUT_MILLIS = 20 * 1000;    private static final long HTTP_RESPONSE_DISK_CACHE_MAX_SIZE = 10 * 1024 * 1024;    private static volatile OkHttpUtils sInstance;private OkHttpClient mOkHttpClient;private OkHttpUtils() {HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();//包含header、body数据loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);mOkHttpClient = new OkHttpClient.Builder().readTimeout(DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS).writeTimeout(DEFAULT_WRITE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS).connectTimeout(DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)//FaceBook 网络调试器,可在Chrome调试网络请求,查看SharePreferences,数据库等.addNetworkInterceptor(new StethoInterceptor())//http数据log,日志中打印出HTTP请求&响应数据.addInterceptor(loggingInterceptor).build();}public static OkHttpUtils getInstance() {if (sInstance == null) {synchronized (OkHttpUtils.class) {if (sInstance == null) {sInstance = new OkHttpUtils();}}}return sInstance;}public OkHttpClient getOkHttpClient() {return mOkHttpClient;}public void setCache(Context appContext) {final File baseDir = appContext.getApplicationContext().getCacheDir();if (baseDir != null) {final File cacheDir = new File(baseDir, "HttpResponseCache");mOkHttpClient.newBuilder().cache((new Cache(cacheDir, HTTP_RESPONSE_DISK_CACHE_MAX_SIZE)));}}
}
在所有需要用到OkHttpClient的地方使用以下代码,全局使用同一个OkHttpClient实例:
OkHttpClient okHttpClient = OkHttpUtils.getInstance().getOkHttpClient();
全局使用一个OkHttpClient的原因是所有请求没必要创建多个请求客户端实例,一个好处是节省内存,另外一个是全局设定了一些监控工具,如Facebook的Stetho 和 OkHttp自带的HttpLoggingInterceptor,你就可以监管你的所有Http请求。

2. HttpLoggingInterceptor Log直接观察HTTP请求&响应数据

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
//包含header、body数据
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);//在build OkHttpClient的时候加入Log拦截器
OkHttpClient.Builder().addInterceptor(loggingInterceptor)
HttpLoggingInterceptor的效果如下图,开发时如果需要看整个App的所有请求及相应,可以使用okhttp关键字过滤。
OkHttp3拦截器Log打印.png
在实例化你的HttpLoggingInterceptor的时候传入一个Logger参数,可以定制化OkHttp输出的格式化http请求体&响应体log。

3. Facebook强大的监测工具:Stetho

3.1 在build OkHttpClient时需要添加网络拦截器

OkHttpClient.Builder().addNetworkInterceptor(new StethoInterceptor())

3.2 在Application的OnCreate中初始化

//FaceBook调试器,可在Chrome调试网络请求,查看SharePreferences,数据库等
Stetho.initializeWithDefaults(this);

3.3 连接手机,在Chrome中打开<a>chome://inspect/#devices</a>

看到如下界面,则代表监测成功,如果没有App显示,那应该就是忘了在Application中初始化Stetho
chrome://inspect/#devices.png

3.4 查看网络请求

请求概览
HTTP响应body

3.5查看数据库

查看数据库
查看SharePreferences也同理,点击Local Storage就是你的App的所有SharePreferences。

4. 自定义OkHttp拦截器

当你与服务端对接的时候,当服务端功能还没开发完成,而你等待着服务器的接口测试时,自定义拦截器就可以帮你无需等待服务端完成功能先进行开发。步骤:1)先与服务端协商接口返回数据格式,拿到协商的数据,写一些假数据,每个接口对应建立一个JSON文本文件,里面放接口定义的数据。
数据文件,服务端同学提供测试数据.png
2)自定义拦截器
/** * 自定义okhttp拦截器,可定制接口伪造Http响应数据 */
public final class MockDataApiInterceptor implements Interceptor {
public static final String TAG = MockDataApiInterceptor.class.getSimpleName();@Overridepublic Response intercept(Chain chain) throws IOException {Response response = null;String path = chain.request().url().uri().getPath();LogUtil.d(TAG, "intercept: path=" + path);response = interceptRequestWhenDebug(chain, path);if (null == response) {LogUtil.i(TAG, "intercept: null == response");response = chain.proceed(chain.request());}        return response;}/*** 测试环境下拦截需要的接口请求,伪造数据返回** @param chain 拦截器链* @param path  请求的路径path* @return 伪造的请求Response,有可能为null*/private Response interceptRequestWhenDebug(Chain chain, String path) {Response response = null;if (BuildConfig.DEBUG) {Request request = chain.request();if (path.equalsIgnoreCase("/api/event")) {//活动列表接口response = getMockEventListResponse(request);} else if (path.startsWith("/api/event/")) {//活动详情接口response = getMockEventDetailResponse(request);} }return response;}/*** 伪造活动详情接口响应** @param request 用户的请求* @return 伪造的活动详情HTTP响应*/private Response getMockEventDetailResponse(Request request) {Response response;String data = MockDataGenerator.getMockDataFromJsonFile("mock/EventDetail.json");response = getHttpSuccessResponse(request, data);return response;}/*** 伪造活动列表接口响应** @param request 用户的请求* @return 伪造的活动列表HTTP响应*/private Response getMockEventListResponse(Request request) {Response response;String data = MockDataGenerator.getMockDataFromJsonFile("mock/EventList.json");response = getHttpSuccessResponse(request, data);return response;}/*** 根据数据JSON字符串构造HTTP响应,在JSON数据不为空的情况下返回200响应,否则返回500响应** @param request  用户的请求* @param dataJson 响应数据,JSON格式* @return 构造的HTTP响应*/private Response getHttpSuccessResponse(Request request, String dataJson) {Response response;if (TextUtils.isEmpty(dataJson)) {LogUtil.w(TAG, "getHttpSuccessResponse: dataJson is empty!");response = new Response.Builder().code(500).protocol(Protocol.HTTP_1_0).request(request)//必须设置protocol&request,否则会抛出异常.build();} else {response = new Response.Builder().code(200).message(dataJson).request(request).protocol(Protocol.HTTP_1_0).addHeader("Content-Type", "application/json").body(ResponseBody.create(MediaType.parse("application/json"), dataJson))                    .build();}return response;}private Response getHttpFailedResponse(Chain chain, int errorCode, String errorMsg) {if (errorCode < 0) {throw new IllegalArgumentException("httpCode must not be negative");}Response response;response = new Response.Builder().code(errorCode).message(errorMsg).request(chain.request()).protocol(Protocol.HTTP_1_0).build();return response;}
}
接口返回什么数据都由你自己定义,即使是Http的响应码等。这里的响应body我们使用服务端同学给我们提供的JSON文件3)在build OkHttpClient时添加自定义拦截器
OkHttpClient.Builder().addInterceptor(new MockDataApiInterceptor())
4)进行开发,完善数据解析逻辑等,与View结合等。

使用OkHttp高效开发调试相关推荐

  1. Flutter调试技巧总结——高效开发的秘密

    刚开始学前端的时候看到大家都是用的console.log()作为调试的手段,也可以说,很多人只会用console.log().在学习Flutter开发app的时候,我就在思考,除了使用print()来 ...

  2. Python 程序如何高效地调试?

    Python在debug方面的支持还是不错的,在明确代码意义的情况下,通过log.print和assert分析错误原因,配合单元测试可以很高效.然而,实际工作中大量代码很可能出自他人之手,这种情况下, ...

  3. ise verilog多模块编译_如何使用ISE高效开发Verilog项目(新手)

    高效开发VerilogHDL项目 V1.0@2014.11.22 作者:刘乾@北航计算机学院 免责声明 这份文档完全是依据作者在实际项目开发中总结出的经验撰写而成的.本文档仅供参考.作者不对文档中的任 ...

  4. VSCODE 10个高效开发插件

    首先介绍如何安装插件 下面介绍目前前端开发最受欢迎的开发工具 VSCode 必装的 10 个开发插件,用于大大提高软件开发的效率. VSCode 的基本使用可以参考我的原创视频教程「VSCode 高效 ...

  5. 只会用console.log调试?快来试试这些高效的调试方法

    别光知道用console.log调试了,快来试试这些高效的调试方法! 作为一名前端开发人员,你一定经常是用 console.log 来进行开发调试,这当然没什么问题,但你可能不知道,除了 consol ...

  6. swagger 返回json字符串_[Swagger] Swagger Codegen 高效开发客户端对接服务端代码

    [Swagger] Swagger Codegen 高效开发客户端对接服务端代码 @TOC 手机用户请横屏获取最佳阅读体验,REFERENCES中是本文参考的链接,如需要链接和更多资源,可以关注其他博 ...

  7. Android Studio入门(安装--开发调试)

    写在前面的话:本文来源:http://blog.csdn.net/yanbober/article/details/45306483 目标:Android Studio新手–>下载安装配置–&g ...

  8. 精雕细琢见真章《STM32Cube高效开发教程》

    我们编写的新书<STM32Cube高效开发教程(基础篇)>终于在各大电商平台上架销售了,这是值得众多STM32开发者入手的一本新书,它是目前市面上第一本采用STM32CubeMX和STM3 ...

  9. 应广单片机开发调试应注意的问题

    单片机开发调试应注意的问题 1.使用总线不外引的单片机 ·是最正统的单片机使用模式 ·符合小型.简单.可靠.廉价的单片机设计初衷 ·总线封闭的产品最可靠 2.使用单片机C语言编程 * C语言是简洁.高 ...

最新文章

  1. cs python课程 加州大学_B站的CS课程整理 搬运
  2. 【转】SOAR平台初探(一)
  3. linux 窗口管理器_您最喜欢的Linux窗口管理器是什么?
  4. CI中写原生SQL(封装查询)
  5. Matlab函数——randn
  6. miscrosoft visio 2003记
  7. KEIL5 各个版本编译器的下载
  8. cwtvc工况_C-WTVC循环数据.xls
  9. 基于SSM的微信小程序在线学习系统源码【包调试】
  10. 阶段性总结(从软件工程到分层架构)
  11. matlab 矩阵位移法编程 结构力学,matlab-矩阵位移法编程-结构力学
  12. 舆情、网络舆情、舆情分析
  13. 工资被倒挂,想离职很正常,但这3种情况要警惕
  14. 一键完成:批量转pdf图片为png、svg格式图片
  15. Android 超好用的万能播放器——ijkplayer
  16. java实现Excel文件上传下载(模板)-hutool
  17. 新型勒索软件WannaRen风险通告
  18. 在Alt+Tab 时Edge浏览器整体作为一个窗口,而不是每个标签页(选项卡)作为一个窗口
  19. Oracle 配置Linux环境 ArcGIS Server 64位客户端创建SDE
  20. Windows10 PyTorch1.5 安装教程 | 很详细

热门文章

  1. pythonppt教材_PPT、H5、Python、大数据……浙江中小学新教材9月投入使用!
  2. php 运行外部程序_php 中运行外部程序的一个潜在风险
  3. gpt最大分区容量_[电脑知识]GUID(GPT)磁盘全局唯一分区表详解
  4. java redis设置过期时间_Redis的一些核心原理
  5. java socket中属性详解_前端开发:关于Vue组件中的data属性值是函数而不是对象的详解...
  6. 「译」在JavaScript中将值转换为字符串的5种方法
  7. XXL-JOB v2.0.1 发布,分布式任务调度平台
  8. Java与Excel的交互!-
  9. Android友盟增量更新
  10. 蓄力十年,做一个成就