一個后臺顯示錯誤而引發(fā)的思考:如何將OkHttp的user-agent替換成默認(rèn)的值

作為一款“認(rèn)真的”產(chǎn)品,那么就要為用戶的數(shù)據(jù)負(fù)責(zé),就要足夠的了解用戶的行為桐腌,掌握一些可以幫助我們分析用戶行為的數(shù)據(jù)。而項(xiàng)目的后臺苟径,就是將這些數(shù)據(jù)展示給我們的運(yùn)營人員案站,從而給他們的工作提供數(shù)據(jù)支持

沒錯,其實(shí)上面的話并不是什么偉人說的棘街,而是我隨手寫的蟆盐。

但是,了解用戶真的很重要遭殉。

所以石挂,在我司的后臺就有一些基本的用戶數(shù)據(jù),其中就包括用戶使用的設(shè)備平臺险污,型號等等痹愚。

然后,某一天負(fù)責(zé)后臺的通知跟我說:“怎么最近有很多desktop的用戶蛔糯,而且使用的OS還是無法識別的拯腮?”


這的確是個奇怪的現(xiàn)象,但是奇怪歸奇怪蚁飒,問題還是要解決的动壤。我問了一些后臺的同志,是怎么識別設(shè)備平臺的淮逻,答曰:根據(jù)用戶請求中的header中的user-agent來識別的狼电。

解決問題前:確定為什么會出問題

研究一下出問題的user的請求數(shù)據(jù)

發(fā)現(xiàn)原來真的是Android設(shè)備的鍋了


其中user-agent是okhttp蜒灰,這個就是前陣子才換上的一個網(wǎng)絡(luò)請求庫(這個真的好用)。

那么問題就明顯了:因?yàn)槲仪瓣囎幼约悍庋b了Okhttp+retrofit+rxjava,所以自那之后所以經(jīng)過OkHttp的請求中的user-agent就被修改成Okhttp自己的標(biāo)志了肩碟。然后人家后臺的同志都不認(rèn)識你强窖,所以就給標(biāo)上了Other OS。削祈。翅溺。

對于解決方案的思考

既然已經(jīng)發(fā)現(xiàn)了問題所在,那么自然就要想辦法解決問題了髓抑。解決問題的核心無外乎就是對癥下藥

方法一:

讓后臺的同志認(rèn)識一下okhttp咙崎,以后只要遇到okhttp就不管三七二十一,直接當(dāng)做Android OS來對付就行了吨拍。

后臺的同志就有意見了:明明是你的鍋褪猛,為何我來背?

好吧羹饰,好像很有道理伊滋。

方法二:

那就換回原生的網(wǎng)絡(luò)請求庫咯!what队秩?笑旺??這簡直就有點(diǎn)zz了馍资,先不說現(xiàn)在okhttp的優(yōu)越性筒主,單單換回去也是要成本的,更何況當(dāng)初集成okhttp+retrofit+rxjava都已經(jīng)花了一些時間了鸟蟹。

那么這個方法也pass乌妙!

方法三:

那既然是okhttp請求的user-agent的問題,那就換掉它的user-agent咯建钥!

bingo藤韵,這才是正解!=跽搿!

接下來就開始正文了置蜀,如何替換okhttp中的user-agent奈搜?

讓我們擼起袖子開始干吧

問題找到了,解決方案也敲定了盯荤,那么就可以開始開工了馋吗。

first

要替換okhttp請求的user-agent,就要先攔截okhttp的請求秋秤,在請求真正發(fā)出去之前我們先給它弄一下

根據(jù)okhttp的文檔宏粤,我們知道在創(chuàng)建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之后绍哎,就可以準(zhǔn)備動個小手術(shù)了

? ? ? ? ? ? ? ? //修改成默認(rèn)的user_agent

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

third

你可能會問getUserAgent()是什么鬼来农?

其實(shí)這只是一個獲取Android默認(rèn)user-agent的函數(shù)罷了,如下

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

打包崇堰、編譯沃于、測試之后

終于是正常了!


結(jié)束語

其實(shí)在日常的開發(fā)過程中海诲,最好的學(xué)習(xí)方法就是上手去做繁莹。

這只是一個小小的例子,通過研究一個小小的bug特幔,我們更加的了解了okhttp咨演,甚至舉一反三,在日后要對請求做身份識別之類的限制蚯斯,也都可以很快的運(yùn)用上(例如每個用戶都要有自己的token薄风,請求時要在header中加上token來識別身份)。

文筆不行溉跃,得空隨手記錄一下

請輕噴

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末村刨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子撰茎,更是在濱河造成了極大的恐慌嵌牺,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件龄糊,死亡現(xiàn)場離奇詭異逆粹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)炫惩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門僻弹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人他嚷,你說我怎么就攤上這事蹋绽。” “怎么了筋蓖?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵卸耘,是天一觀的道長。 經(jīng)常有香客問我粘咖,道長蚣抗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任瓮下,我火速辦了婚禮翰铡,結(jié)果婚禮上钝域,老公的妹妹穿的比我還像新娘。我一直安慰自己锭魔,他們只是感情好例证,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赂毯,像睡著了一般战虏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上党涕,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天烦感,我揣著相機(jī)與錄音,去河邊找鬼膛堤。 笑死手趣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肥荔。 我是一名探鬼主播绿渣,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼燕耿!你這毒婦竟也來了中符?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤誉帅,失蹤者是張志新(化名)和其女友劉穎淀散,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚜锨,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡档插,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了亚再。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郭膛。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氛悬,靈堂內(nèi)的尸體忽然破棺而出则剃,到底是詐尸還是另有隱情,我是刑警寧澤如捅,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布棍现,位于F島的核電站,受9級特大地震影響伪朽,放射性物質(zhì)發(fā)生泄漏轴咱。R本人自食惡果不足惜汛蝙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一烈涮、第九天 我趴在偏房一處隱蔽的房頂上張望伶授。 院中可真熱鬧谁鳍,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灯抛。三九已至妇押,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跳昼,已是汗流浹背般甲。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹅颊,地道東北人敷存。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像堪伍,于是被迫代替她去往敵國和親锚烦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理帝雇,服務(wù)發(fā)現(xiàn)涮俄,斷路器,智...
    卡卡羅2017閱讀 134,708評論 18 139
  • 一尸闸、簡介 Retrofit是Square公司開發(fā)的一款針對Android網(wǎng)絡(luò)請求的框架彻亲,Retrofit2底層基于...
    Devil不加V閱讀 556評論 0 0
  • Retrofit用法詳解 一、簡介 Retrofit是Square公司開發(fā)的一款針對Android網(wǎng)絡(luò)請求的框架室叉,...
    流水潺湲閱讀 860評論 0 6
  • 是Square公司開發(fā)的一款針對Android網(wǎng)絡(luò)請求的框架睹栖,Retrofit2底層基于OkHttp實(shí)現(xiàn)的,現(xiàn)在已...
    Android開發(fā)__落岑閱讀 1,809評論 0 2
  • 今天Grace分享的是關(guān)于榜樣茧痕,她的分享每次都能開闊我的思維野来,她又一次把我頭腦中的榜樣延展到生活中的人、事踪旷、物曼氛。...
    遁格閱讀 287評論 2 0