OKHTTP的心得

最近在一直在做的一個(gè)APK,以前的上傳和下載的都是使用別人封裝好的sdk,依懶性太強(qiáng)株搔,剛好最近有時(shí)間采缚,打算舍棄以前的sdk,使用OKHTTP來完成上傳和下載的工作淡溯。在此總結(jié)下自己的心得兵琳,在做這個(gè)功能的時(shí)候勃蜘,自己是一個(gè)小白硕噩,什么都不知道,現(xiàn)在總算是踉踉蹌蹌的把功能做完了缭贡,其實(shí)還是還是有一些地方不是很懂炉擅,但是還是打算將自己的過程大概總結(jié)下。很簡單阳惹,大神可以忽略谍失,哈哈

在此借鑒大神的博客,粗略的理解下okhttp的原理

Okhttp:是一款HTTP框架莹汤,它支持get請(qǐng)求和post請(qǐng)求快鱼,支持基于Http的文件上傳和下載,支持加載圖片纲岭,支持下載文件透明的GZIP壓縮抹竹,支持響應(yīng)緩存避免重復(fù)的網(wǎng)絡(luò)請(qǐng)求,支持使用連接池來降低響應(yīng)延遲問題止潮。

okhttp的簡單原理(如下兩幅圖的理解均為大神博客的參考):

okhttp在請(qǐng)求的時(shí)候會(huì)有一個(gè)engine窃判,這個(gè)engine就像是一個(gè)管理站,他控制著需要那種方式的請(qǐng)求喇闸,比如是異步還是同步袄琳。在connetion的時(shí)候,就是真正建立連接的時(shí)候燃乍,有自己的線程池機(jī)制唆樊,更選擇更優(yōu)化的處理方式。而真正達(dá)到服務(wù)端的時(shí)候刻蟹,會(huì)先經(jīng)過路由逗旁,路由其實(shí)就是一個(gè)注冊(cè)表(個(gè)人理解)是一套協(xié)議,比如代理座咆,IP地址等痢艺,選擇正確的協(xié)議去打開server的大門。下面是請(qǐng)求的流程:


1 ?將okhttp-2.7.5.jar ?okio-1.7.0.jar 放入lib底下介陶,同時(shí)在buid.gradle底下引入

2 開始步入正軌堤舒,

@ 1 加載證書

此方法最后返回一個(gè)SSLSocketFactory,目的:為了給okhttpClient.setSSLSocketFactory()設(shè)置

?@2 請(qǐng)求過程:

OkhttpClient client = new OkhttpClient();

client.setSSLSocketFactory(Util.initSSLSocketFactory(context));

RequestBody fromBody =new FormEncodingBuilder().add(string,value),主要是設(shè)置https的url的body

Request request =new Request.Builder().post(fromBody).url(testurl).build();

Call call = client.newCall(request);

call.enqueue(new okhttp.callback()){

? ? ? ?onfail()

? ? ? onresponse()

}

上面的代碼主要是傳一個(gè)url哺呜,得到服務(wù)器響應(yīng),然后返回json數(shù)據(jù)

假如我們需要向某一個(gè)url傳一個(gè)文件舌缤,這個(gè)時(shí)候應(yīng)該怎么做呢,這是我遇到的坑,在網(wǎng)上找好久的文章国撵,終于把問題解決了陵吸,在此給大家說一下

證書以及請(qǐng)求等過程都是一樣的,主要是body部分的區(qū)別:

MultipartBuilder builder =new MultipartBuilder().type(MultipartBuilder.FORM);

File file =new File(上傳文件的路徑);

RequestBody dbBody = RequestBody.create(MediaType.parse("text/plain"), file);

builder.addFormDataPart(string, value).addFormDataPart("filePath", file.getName(), dbBody);

RequestBody multipartBody = builder.build();

在開發(fā)這個(gè)小需求的時(shí)候介牙,還遇到一個(gè)問題壮虫,困擾了我很久,就是將上傳文件的進(jìn)度也要顯示出來环础,自己的做法如下

a:重寫requestBody(百度上有很多例子), b: 寫一個(gè)關(guān)于進(jìn)度的RequestProgressListener,主要是得到流后的回調(diào)

private Sinksink(Sink sink) {

return new ForwardingSink(sink) {

//當(dāng)前寫入字節(jié)數(shù)

? ? ? ? long bytesWritten =0L;

? ? ? ? //總字節(jié)長度囚似,避免多次調(diào)用contentLength()方法

? ? ? ? long contentLength =0L;

? ? ? ? @Override

? ? ? ? public void write(Buffer source, long byteCount)throws IOException {

super.write(source, byteCount);

? ? ? ? ? ? if (contentLength ==0) {

//獲得contentLength的值,后續(xù)不再調(diào)用

? ? ? ? ? ? ? ? contentLength = contentLength();

? ? ? ? ? ? }

//增加當(dāng)前寫入的字節(jié)數(shù)

? ? ? ? ? ? bytesWritten += byteCount;

? ? ? ? ? ? //回調(diào)

? ? ? ? ? ? mRequestProgressListener.onRequestProgress(bytesWritten, contentLength, bytesWritten ==contentLength);

? ? ? ? }

};


@3如果是需要進(jìn)度的話线得,下面這個(gè)步驟中需要有部分修改

將剛才重寫的CmlBody代替fromBody饶唤,同時(shí)傳入進(jìn)度的listener

Request request =new Request.Builder().post(fromBody).url(testurl).build();


MD5加密的理解(項(xiàng)目中有用到MD5加密,在此將自己的一點(diǎn)理解附上)

public static String digest(String content){

StringBuilder builder = new StringBuilder();

try {

MessageDigest msgDitest = MessageDigest.getInstance("MD5");

msgDitest.update(content.getBytes());

byte[] digests = msgDitest.digest();

builder.append(Integer.toHexString(digests[i] & 0xff ));

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贯钩,一起剝皮案震驚了整個(gè)濱河市募狂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌角雷,老刑警劉巖祸穷,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異勺三,居然都是意外死亡粱哼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門檩咱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胯舷,你說我怎么就攤上這事刻蚯。” “怎么了桑嘶?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵炊汹,是天一觀的道長。 經(jīng)常有香客問我逃顶,道長讨便,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任以政,我火速辦了婚禮霸褒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盈蛮。我一直安慰自己废菱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著殊轴,像睡著了一般衰倦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旁理,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天樊零,我揣著相機(jī)與錄音,去河邊找鬼孽文。 笑死驻襟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叛溢。 我是一名探鬼主播塑悼,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼楷掉!你這毒婦竟也來了厢蒜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤烹植,失蹤者是張志新(化名)和其女友劉穎斑鸦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體草雕,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巷屿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了墩虹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘱巾。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诫钓,靈堂內(nèi)的尸體忽然破棺而出旬昭,到底是詐尸還是另有隱情,我是刑警寧澤菌湃,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布问拘,位于F島的核電站,受9級(jí)特大地震影響惧所,放射性物質(zhì)發(fā)生泄漏骤坐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一下愈、第九天 我趴在偏房一處隱蔽的房頂上張望纽绍。 院中可真熱鬧,春花似錦势似、人聲如沸顶岸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辖佣。三九已至霹抛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卷谈,已是汗流浹背杯拐。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留世蔗,地道東北人端逼。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像污淋,于是被迫代替她去往敵國和親顶滩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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