一个后台显示错误而引发的思考:如何将OkHttp的user-agent替换成默认的值

作为一款“认真的”产品,那么就要为用户的数据负责,就要足够的了解用户的行为,掌握一些可以帮助我们分析用户行为的数据。而项目的后台,就是将这些数据展示给我们的运营人员,从而给他们的工作提供数据支持

没错,其实上面的话并不是什么伟人说的,而是我随手写的。

但是,了解用户真的很重要。

所以,在我司的后台就有一些基本的用户数据,其中就包括用户使用的设备平台,型号等等。

然后,某一天负责后台的通知跟我说:“怎么最近有很多desktop的用户,而且使用的OS还是无法识别的?”


这的确是个奇怪的现象,但是奇怪归奇怪,问题还是要解决的。我问了一些后台的同志,是怎么识别设备平台的,答曰:根据用户请求中的header中的user-agent来识别的。

解决问题前:确定为什么会出问题

研究一下出问题的user的请求数据

发现原来真的是Android设备的锅了


其中user-agent是okhttp,这个就是前阵子才换上的一个网络请求库(这个真的好用)。

那么问题就明显了:因为我前阵子自己封装了Okhttp+retrofit+rxjava,所以自那之后所以经过OkHttp的请求中的user-agent就被修改成Okhttp自己的标志了。然后人家后台的同志都不认识你,所以就给标上了Other OS。。。

对于解决方案的思考

既然已经发现了问题所在,那么自然就要想办法解决问题了。解决问题的核心无外乎就是对症下药

方法一:

让后台的同志认识一下okhttp,以后只要遇到okhttp就不管三七二十一,直接当做Android OS来对付就行了。

后台的同志就有意见了:明明是你的锅,为何我来背?

好吧,好像很有道理。

方法二:

那就换回原生的网络请求库咯!what???这简直就有点zz了,先不说现在okhttp的优越性,单单换回去也是要成本的,更何况当初集成okhttp+retrofit+rxjava都已经花了一些时间了。

那么这个方法也pass!

方法三:

那既然是okhttp请求的user-agent的问题,那就换掉它的user-agent咯!

bingo,这才是正解!!!

接下来就开始正文了,如何替换okhttp中的user-agent?

让我们撸起袖子开始干吧

问题找到了,解决方案也敲定了,那么就可以开始开工了。

first

要替换okhttp请求的user-agent,就要先拦截okhttp的请求,在请求真正发出去之前我们先给它弄一下

根据okhttp的文档,我们知道在创建Okhtpp client时是可以添加一个拦截器的:

okHttpClientBuilder.addNetworkInterceptor();

因此我们就可以在请求前先拿到request了,如下

okHttpClientBuilder.addNetworkInterceptor(new Interceptor() {

@Override

            public Responseintercept(Chain chain)throws IOException {

                Request original = chain.request();

                Request.Builder builder = original.newBuilder();

//在此修改就可以开始修改user_agent

                 builder.method(original.method(), original.body());

                Request request = builder.build();

                 return chain.proceed(request);

            }

});

second

拿到request的build之后,就可以准备动个小手术了

                //修改成默认的user_agent

                builder.removeHeader("User-Agent").addHeader("User-Agent", getUserAgent()).build();

third

你可能会问getUserAgent()是什么鬼?

其实这只是一个获取Android默认user-agent的函数罢了,如下

private static StringgetUserAgent() {

String userAgent ="";

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {

try {

userAgent = WebSettings.getDefaultUserAgent(TalkpalApplication.getContext());

        }catch (Exception e) {

userAgent = System.getProperty("http.agent");

        }

}else {

userAgent = System.getProperty("http.agent");

    }

StringBuffer sb =new StringBuffer();

    for (int i =0, length = userAgent.length(); i < length; i++) {

char c = userAgent.charAt(i);

        if (c <='\u001f' || c >='\u007f') {

sb.append(String.format("\\u%04x", (int) c));

        }else {

sb.append(c);

        }

}

return sb.toString();

}

last

打包、编译、测试之后

终于是正常了!


结束语

其实在日常的开发过程中,最好的学习方法就是上手去做。

这只是一个小小的例子,通过研究一个小小的bug,我们更加的了解了okhttp,甚至举一反三,在日后要对请求做身份识别之类的限制,也都可以很快的运用上(例如每个用户都要有自己的token,请求时要在header中加上token来识别身份)。

文笔不行,得空随手记录一下

请轻喷

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 一、简介 Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于...
    Devil不加V阅读 529评论 0 0
  • Retrofit用法详解 一、简介 Retrofit是Square公司开发的一款针对Android网络请求的框架,...
    流水潺湲阅读 839评论 0 6
  • 是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,现在已...
    Android开发__落岑阅读 1,784评论 0 2
  • 今天Grace分享的是关于榜样,她的分享每次都能开阔我的思维,她又一次把我头脑中的榜样延展到生活中的人、事、物。...
    遁格阅读 272评论 2 0