一、需求和问题

在开发Android项目时,一定需要和后端对接网络请求,但在因为现在都JSON格式的数据结构,在数据字段前后不一致是Android端是无法判断是是字段错误还是数据本身没有值。所有在数据还没有被Gson反序列前拦截 回应并打印body 就可以知道后端传过来的知道和值的真实情况。

这样就很清楚是Android端的问题还是后端的问题,也可以减少debug的时间。

二、依赖和配置

    //retrofit2implementation 'com.squareup.retrofit2:retrofit:2.9.0'//Gsonimplementation 'com.squareup.retrofit2:converter-gson:2.9.0'//Jackson//implementation 'com.squareup.retrofit2:converter-jackson:2.9.0'implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'//RxJava3的适配器implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'//OkHttp3implementation 'com.squareup.okhttp3:okhttp:4.9.3'//Rxjava3 + RxAndroid3implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'implementation 'io.reactivex.rxjava3:rxjava:3.0.0'// Logger 日志插件implementation 'com.orhanobut:logger:2.2.0'

关于Okhttp3+retrofit2+Rxjava3的具体配置可以参考自学Android开发 我的Retrofit2+RxJava3的封装

三、代码示例

拦截器代码:

public class OkHttpInterceptor implements Interceptor {private final Charset UTF8 = Charset.forName("UTF-8");@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();RequestBody requestBody = request.body();String bodyStr = "";if (requestBody != null) {Buffer buffer = new Buffer();requestBody.writeTo(buffer);Charset charset = UTF8;MediaType contentType = requestBody.contentType();if (contentType != null) {charset = contentType.charset(UTF8);}bodyStr = buffer.readString(charset);}String header = GsonUtil.Companion.getGson().toJson(request.headers());bodyStr = bodyStr == "" ? "无参数" : bodyStr;Response response = chain.proceed(request);ResponseBody responseBody = response.body();String bodyStrRespon = "";BufferedSource source = responseBody.source();source.request(Long.MAX_VALUE);Buffer buffer = source.getBuffer();Charset charset = UTF8;MediaType contentType = responseBody.contentType();if (contentType != null) {try {charset = contentType.charset(UTF8);} catch (UnsupportedCharsetException e) {e.printStackTrace();}}bodyStrRespon = buffer.clone().readString(charset);bodyStrRespon = bodyStrRespon == "" ? "无响应Body" : bodyStrRespon;String url = GsonUtil.Companion.getGson().toJson(response.request().url());String msg = "{\"Response\":{\"code\":" + response.code()+ ",\"method\":\" " + request.method()+"\""+ ",\"请求url\":" + url+ ",\"请求头\":" + header+ ",\"请求参数\":" + bodyStr+ ",\"响应body\":" + bodyStrRespon+ "}}";if (response.code() == 200)LogUtil.Companion.gsonToInfo(msg);elseLogUtil.Companion.error(msg);return response;}
}

LogUtil.Companion.gsonToInfo使用的是Kotlin 封装的logger 工具类,这里虽然使用的是Logger日志工具包,这个log工具包 有好处也有坏处,具体打印工具选择熟悉的。

Interceptor在这里虽然只做了拦截打印请求参数和回应数据,但是如果有前后端需要对数据进行加密时,就只需要更改这里就能完成请求加密和响应结果的解密的处理。

在一些需要对请求头有特殊要求的也可以在这里使用request().newBuilder() 新建一个request又携带旧request的数据,但你可以在这个新的request对旧的数据进行修改覆盖等,如添加请求头等操作。

注意:在打印请求和回复参数时,要注意文件上传时,不要使用这个拦截器,不然会打印文件编码符的,所以建议编写两个拦截器,上传文件时使用不打印请求体 只打印回复体参数。

​​​​​​​

如果对您有一些意义,希望您给博主一些鼓励(点赞、关注、收藏),如果有错误欢迎大家评论。

自学Android开发 关于OkHttp3的request和respond拦截打印Log相关推荐

  1. 酷派手机(Coolpad 8297-T01)在Android开发工具如AndroidStudio、Eclipse中无法打印Log

    原因是机器在出厂时将log的级别做了限制. 解决方法是:拨号盘输入*20121220# -> 选择日志输出级别 -> 选择Java log level -> 选择LOGD即可.

  2. 自学Android开发 AES加密

    目录 一.问题 二.解决源码 一.问题 在Java 后端发来的AES加密数据时,发现Android APP不能解密 而且Android 端 加密同样的数据返回的结果居然不一致,所以我在网上查询后,发现 ...

  3. 自学Android开发(一)

    自学Android开发咯(一) ------------------------------------ 很荣幸大家来看我的自学之路 现在刚好是2019的一月份中旬,也凑到我想学习Android的时间 ...

  4. 分享一下身边朋友自学android开发及找工作的那些事!【不足勿喷】

    写在前面 前不久身边一个朋友突然告诉我他把原来的工作辞掉了,我问他最近在干嘛,他说他最近两个月学了java及android然后花了1周时间找工作,我问他现在怎么样了.他说比不上我们身边这些10K-20 ...

  5. 分享一下身边朋友自学android开发及找工作的那些事!【不足勿喷】 1

    写在前面 前不久身边一个朋友突然告诉我他把原来的工作辞掉了,我问他最近在干嘛,他说他最近两个月学了java及android然后花了1周时间找工作,我问他现在怎么样了.他说比不上我们身边这些10K-20 ...

  6. 在Android Studio上魅族手机、华为手机无法打印Log

    今天突然遇到这两台国产神机集体抽风,让我一度怀疑人生(重装Android Studio,重配Gradle等等,折腾了半天).最后在同事的帮助下在度娘找到了解决方案.在此记录下解决的过程,方便以后查阅. ...

  7. 2019 年美团点评高级 Android 开发寒冬跳槽涨薪经验掏心分享

    2019 年美团点评高级 Android 开发寒冬跳槽涨薪经验掏心分享 目录 个人简介 笔者的简要介绍 跳槽涨薪要考虑的方面有哪些? 你是正在拿着卖白菜的钱,操着卖白粉的心吗? 你真得觉得是时候跑路了 ...

  8. 我靠着这套学习视频+文档,自学Android从外卖小哥走到了头条

    5.受到一些心灵鸡汤的鼓励,比如什么种一颗树最好的时机是十年前,其次,就是现在! 辞职之后 我辞去工作,开始在家自学Android开发.主要的学习方式就是在网上看视频教程.那些视频教程,初级的基本上免 ...

  9. Android开发6年,互联网寒冬公司倒闭后,耗时3个月北上广求职

    至于其他的对大家应该没有难度.同时适当的包装无可厚非,求职者想找个好工作,面试官想找个好员工.对方就像相亲一样.一定会把你的低摸个清楚的.如果相亲的时候的没问题,等孩子都有了那就晚啦.哈哈,我就是这个 ...

最新文章

  1. C# .net 命名规范
  2. 每日一道算法题--leetcode 509--斐波那契数(动态规划)--python
  3. 一、简谈Pandas
  4. c python通信protobuf_python 处理protobuf协议
  5. react - antd (Table 与 Cascader 平级数据转树形实操)
  6. csp 通信网络 java_CSP 通信网络
  7. 这100道面试题,用来忽悠半吊子面试官
  8. Anaconda3自带jupyter
  9. 我们分析了全美Top Business Analyst 和 Data Science专业,最后给你总结了这几点
  10. 电脑清理代码_网络安全宣传周丨电脑中病毒,这样处置!
  11. ux.plup.File plupload 集成 ux.plup.FileLis 批量上传预览
  12. Bin Code Editor格式化JSON编辑器
  13. 使用 String[] values = request.getParameterValues(key);出现的问题 ,Ajax Post 提交数组参数后台无法接收
  14. win10应用商店无法打开重新 加载
  15. 对于微信二维码相关官方文档的一些注解(微信登录和绑定微信、关注公众号)
  16. 华纳云:美国高防服务器的防火墙介绍
  17. css控制文本只显示两行
  18. 【Temasek V9.6】CM13.0 多功能实用增强版 for 华为荣耀5X
  19. 个人学习网站记载(因为并不能转载只能记网站了)
  20. 两分钟让你明白什么是ERP

热门文章

  1. 2011年4月计算机应用基础,2011年4月计算机应用基础-20210606083739.docx-原创力文档...
  2. 中国女性七大肌肤真相
  3. Git - 拉取远程分支并创建本地分支
  4. Ae:文本动画制作器属性
  5. 笔记本老是提示希望计算机做什么,电脑都是怎么被用坏的?这些坏习惯希望你不要有,越早知道越好!...
  6. 关于JQuery轮播图页面切换加载问题解决
  7. 算法基础(ACWing)
  8. Java手机号码工具类(判断运营商、获取归属地)以及简要的原理跟踪
  9. 有什么漫画好看,腾讯动漫APP好看的国产漫画大盘点
  10. 桌面图标的文字背景色如何恢复为透明