OkHttp 拦截器的一些操作,一起刷完了这份1307页的安卓面试宝典吧

StringBuffer sb = new StringBuffer();

sb.append(scheme).append(newHost).append(path).append(“?”);

Set queryList = url.queryParameterNames();

Iterator iterator = queryList.iterator();

for (int i = 0; i < queryList.size(); i++) {

String queryName = iterator.next();

sb.append(queryName).append(“=”);

String queryKey = url.queryParameter(queryName);

//对query的key进行加密

sb.append(CommonUtils.getMD5(queryKey));

if (iterator.hasNext()) {

sb.append(“&”);

}

}

String newUrl = sb.toString();

RequestBody body = request.body();

String bodyToString = requestBodyToString(body);

TestBean testBean = GsonTools.changeGsonToBean(bodyToString, TestBean.class);

String userPassword = testBean.getUserPassword();

//加密body体中的用户密码

testBean.setUserPassword(CommonUtils.getMD5(userPassword));

String testGsonString = GsonTools.createGsonString(testBean);

RequestBody requestBody = RequestBody.create(MediaType.parse(“application/json”), testGsonString);

Request.Builder builder = request.newBuilder()

.post(requestBody)

.url(newUrl);

return chain.proceed(builder.build());

}

}

从上面可以看出我们先拿到body体的内容然后解析后,拿到对应的实体类,然后进行加密,再次创建一个新的body体里面然后post过去,即可达到body体加密,我这只是一种body加密方法,也有可能是拿到body然后进行加密然后对加密后的东西加入head 当成签名使用。

最终这种拦截器方式的加密也是一种统一代码入口的方式。

3、HEAD动态添加

==========

在日常的开发中,可能每个接口对应的header不同有的多有的少。不可能说每个接口都写一个拦截器进行添加头部。这时候我们可以换个思维来考虑这个问题。怎么做呢,其实也是为了统一代码,同一种操作不要再多个地方进行,这样修改起来很麻烦。统一入口,统一出口。

public class TestInterceptor implements Interceptor {

private String newHost = “127.0.0.1”;

private String path1 = “/test/upload/img”;

private String path2 = “/test/upload/voice”;

public static String requestBodyToString(RequestBody requestBody) throws IOException {

Buffer buffer = new Buffer();

requestBody.writeTo(buffer);

return buffer.readUtf8();

}

@Override

public Response intercept(Chain chain) throws IOException {

Request request = chain.request();

HttpUrl url = request.url();

//http://127.0.0.1/test/upload/img?userName=xiaoming&userPassword=12345

String scheme = url.scheme();// http https

String host = url.host();// 127.0.0.1

String path = url.encodedPath();// /test/upload/img

String query = url.encodedQuery();// userName=xiaoming&userPassword=12345

StringBuffer sb = new StringBuffer();

sb.append(scheme).append(newHost).append(path).append(“?”);

Set queryList = url.queryParameterNames();

Iterator iterator = queryList.iterator();

for (int i = 0; i < queryList.size(); i++) {

String queryName = iterator.next();

sb.append(queryName).append(“=”);

String queryKey = url.queryParameter(queryName);

//对query的key进行加密

sb.append(CommonUtils.getMD5(queryKey));

if (iterator.hasNext()) {

sb.append(“&”);

}

}

String newUrl = sb.toString();

RequestBody body = request.body();

String bodyToString = requestBodyToString(body);

TestBean testBean = GsonTools.changeGsonToBean(bodyToString, TestBean.class);

String userPassword = testBean.getUserPassword();

//加密body体中的用户密码

testBean.setUserPassword(CommonUtils.getMD5(userPassword));

String testGsonString = GsonTools.createGsonString(testBean);

RequestBody requestBody = RequestBody.create(MediaType.parse(“application/json”), testGsonString);

Request.Builder builder = request.newBuilder()

.post(requestBody)

.url(newUrl);

switch (path) {

case path1:

builder.addHeader(“token”,“token”);

break;

case path2:

builder.addHeader(“token”,“token”);

builder.addHeader(“uid”,“uid”);

break;

}

return chain.proceed(builder.build());

}

}

根据url中path的不同来动态的添加header,其实写代码吗?每个人实现的方式不同,只要路子对,怎么写都行,看个人。

4、请求日志抓取

========

这个其实已经有现成的log拦截器了,大家日常开发中已经有用过,但是如果说我们只想看到我想要的,过滤那些不要的东西。怎么办呢。只能自己来自定义了。把自己需要的东西打印出来。以免太多每次看很乱。这时候怎么通过拦截器完成这样的一个骚操作呢。也很简单,基于上面的基础我们应该该拿到的都拿到了。

public class TestInterceptor implements Interceptor {

private String newHost = “127.0.0.1”;

private String path1 = “/test/upload/img”;

private String path2 = “/test/upload/voice”;

private String TAG = “TestInterceptor”;

public static String requestBodyToString(RequestBody requestBody) throws IOException {

Buffer buffer = new Buffer();

requestBody.writeTo(buffer);

return buffer.readUtf8();

}

@Override

public Response intercept(Chain chain) throws IOException {

Request request = chain.request();

Response response = chain.proceed(request);

HttpUrl url = request.url();

//http://127.0.0.1/test/upload/img?userName=xiaoming&userPassword=12345

String scheme = url.scheme();// http https

String host = url.host();// 127.0.0.1

String path = url.encodedPath();// /test/upload/img

String query = url.encodedQuery();// userName=xiaoming&userPassword=12345

RequestBody body = request.body();

String bodyToString = requestBodyToString(body);

Log.e(TAG,scheme);

Log.e(TAG,host);

Log.e(TAG,path);

Log.e(TAG,query);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后,如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击我的GitHub免费领取~

这里是关于我自己的Android 学习,面试文档,视频收集大整理,有兴趣的伙伴们可以看看~

OXf-1710670168480)]

最后,如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击我的GitHub免费领取~

这里是关于我自己的Android 学习,面试文档,视频收集大整理,有兴趣的伙伴们可以看看~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值