Okhttp使用總結(jié)

在項(xiàng)目中用的是Okhttp 3.4.2,替換原有的網(wǎng)絡(luò)框架奄容,okhttp使用很方便,封裝性很好产徊,在此紀(jì)錄一下使用過(guò)程中遇到的問(wèn)題昂勒。

1.返回?cái)?shù)據(jù)亂碼的問(wèn)題

由于服務(wù)器返回的數(shù)據(jù)本身就是Gzip格式,原有的網(wǎng)絡(luò)框架也是請(qǐng)求服務(wù)端返回Gzip格式舟铜,替換為okhttp后戈盈,照常添加addHeader("Accept-Encoding", "gzip, deflate"),結(jié)果服務(wù)器返回亂碼谆刨,無(wú)論怎么處理塘娶,試過(guò)轉(zhuǎn)換成字節(jié),編碼格式替換為gb2312痊夭,轉(zhuǎn)換成流處理血柳,都沒(méi)有用,客戶端得到的異常如下:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected
BEGIN_OBJECT but was STRING at line 1 column 1
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 
Expected BEGIN_OBJECT but was STRING at line 1 column 1

第二天早上坐車(chē)去公司的路上生兆,查了一下google,無(wú)意中想到會(huì)不會(huì)是Gzip沒(méi)有解壓導(dǎo)致的膝宁,但是Okhttp又是對(duì)Gzip自動(dòng)支持并且自動(dòng)解壓的鸦难,最后查了源碼,才算明白是怎么回事员淫。

// If we add an "Accept-Encoding: gzip" header field we're responsible for also decompressing
// the transfer stream.
boolean transparentGzip = false;
if (userRequest.header("Accept-Encoding") == null)
{
  transparentGzip = true;
  requestBuilder.header("Accept-Encoding", "gzip");
}

if (transparentGzip &&
 "gzip".equalsIgnoreCase(networkResponse.header("Content-Encoding"))
    && HttpHeaders.hasBody(networkResponse))
{
  GzipSource responseBody = new GzipSource(networkResponse.body().source());
  Headers strippedHeaders = networkResponse.headers().newBuilder()
      .removeAll("Content-Encoding")
      .removeAll("Content-Length")
      .build();
  responseBuilder.headers(strippedHeaders);
  responseBuilder.body(new RealResponseBody(strippedHeaders, Okio.buffer(responseBody)));
}

上段代碼摘自BridgeInterceptor類(lèi)中合蔽,現(xiàn)在明白為什么了嗎?如果Request的header中用戶加了header("Accept-Encoding")的話介返,那么Okhttp不會(huì)幫你處理Gzip的解壓拴事,需要你自己去處理。那么問(wèn)題就好辦了圣蝎,把Request的header中去掉header("Accept-Encoding")就行了刃宵,調(diào)試不再出現(xiàn)亂碼,完美徘公。

2.怎么取消一次Request請(qǐng)求

原有的網(wǎng)絡(luò)請(qǐng)求庫(kù)中牲证,部分Api做了cancel的操作,那替換成了okhttp之后关面,怎么把這部分做一個(gè)處理呢坦袍?
還好okhttp可以通過(guò)Request.Builder.tag("url")來(lái)打tag十厢,然后通過(guò)下述代碼即可做到cancel某一個(gè)Request的功能,你需要做的只是返回url就行了捂齐。

public static void cancelCallWithTag(String tag) {
    for (Call call : RequestApi2.getInstance().getOkHttpClient().dispatcher().queuedCalls()) {
        if (call.request().tag().equals(tag))
            call.cancel();
    }
    for (Call call : RequestApi2.getInstance().getOkHttpClient().dispatcher().runningCalls()) {
        if (call.request().tag().equals(tag))
            call.cancel();
    }
}

3.順便紀(jì)錄一下Post中生成RequestBody的兩種方式

FormBody.Builder formBuilder = new FormBody.Builder();
RequestBody requestBody = formBuilder.build();
//對(duì)于Json的字符串蛮放,可以用這種方式
final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody.create(JSON, data)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奠宜,隨后出現(xiàn)的幾起案子包颁,更是在濱河造成了極大的恐慌,老刑警劉巖挎塌,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徘六,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡榴都,警方通過(guò)查閱死者的電腦和手機(jī)待锈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嘴高,“玉大人竿音,你說(shuō)我怎么就攤上這事∷┩裕” “怎么了春瞬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)套啤。 經(jīng)常有香客問(wèn)我宽气,道長(zhǎng),這世上最難降的妖魔是什么潜沦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任萄涯,我火速辦了婚禮,結(jié)果婚禮上唆鸡,老公的妹妹穿的比我還像新娘涝影。我一直安慰自己,他們只是感情好争占,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布燃逻。 她就那樣靜靜地躺著,像睡著了一般臂痕。 火紅的嫁衣襯著肌膚如雪伯襟。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天握童,我揣著相機(jī)與錄音逗旁,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛片效,可吹牛的內(nèi)容都是我干的红伦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼淀衣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昙读!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起膨桥,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛮浑,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后只嚣,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沮稚,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年册舞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蕴掏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡调鲸,死狀恐怖盛杰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情藐石,我是刑警寧澤即供,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站于微,受9級(jí)特大地震影響逗嫡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜株依,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一祸穷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧勺三,春花似錦、人聲如沸需曾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)呆万。三九已至商源,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谋减,已是汗流浹背牡彻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庄吼。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓缎除,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親总寻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子器罐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • okhttp簡(jiǎn)介 特點(diǎn) 1.支持http和https協(xié)議,api相同,易用;2.http使用線程池,https使用...
    liuchangng閱讀 885評(píng)論 0 0
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)渐行,斷路器轰坊,智...
    卡卡羅2017閱讀 134,667評(píng)論 18 139
  • 進(jìn)入主題之前,我們先來(lái)看一下客戶端與服務(wù)器通信過(guò)程中祟印,如果服務(wù)器支持肴沫,HTTP gzip壓縮是如何實(shí)現(xiàn)的? 如圖所...
    GavinCT閱讀 4,140評(píng)論 0 24
  • 六談這個(gè)話題蕴忆,是因?yàn)楹芏鄷r(shí)間都忽略了這個(gè)因素颤芬,網(wǎng)絡(luò)傳輸數(shù)據(jù)的壓縮很少有人去關(guān)注,然而有時(shí)間提到這個(gè)問(wèn)題的時(shí)間卻一時(shí)...
    Eric_feng閱讀 5,562評(píng)論 0 4
  • Interceptor OkHttp 為了更好的閱讀體驗(yàn)孽文,可以移步至根據(jù)Interceptor 分析 OkHttp...
    TOP_WANG閱讀 1,083評(píng)論 0 0