OkHttp基本使用流程總結(jié)

http請(qǐng)求主要是GetPost。二者都分為的同步和異步請(qǐng)求型宝。

Get和Post的區(qū)別:

Get用來(lái)做簡(jiǎn)單的數(shù)據(jù)請(qǐng)求稠诲,請(qǐng)求的數(shù)據(jù)寫在地址上侦鹏,比如:
http://www.reibang.com/search?q=bilibili&page=1&type=notes
其中http://www.reibang.com/ 是主機(jī)地址search后面的?q=bilibili&page=1&type=notes 是你的請(qǐng)求信息,以鍵值對(duì)的形式直接加載地址上臀叙,用&符號(hào)隔開,任何人都看得到价卤。所以GET請(qǐng)求是不安全的劝萤。一般不重要的請(qǐng)求,并且你的請(qǐng)求信息的數(shù)據(jù)量不大的就可以用GET請(qǐng)求慎璧。

POST算是GET請(qǐng)求的升級(jí)版床嫌。它將請(qǐng)求信息寫在RequestBody里面,RequestBody可以裝很多東西胸私,比如GET請(qǐng)求的鍵值對(duì)信息厌处,用戶賬號(hào)登錄就可以用POST請(qǐng)求啦。也可以上傳文件岁疼,這些是GET請(qǐng)求不能的阔涉。

OkHttp 請(qǐng)求流程:(基于okhttp3)

1 . 創(chuàng)建OkhttpClient。(注:全局最好只創(chuàng)建1個(gè)OkHttpClient捷绒,推薦使用單例模式創(chuàng)建)
OkhttpClient mClient = new OkhttpClient();
2 . mClient執(zhí)行newCall將Request轉(zhuǎn)化成一個(gè)Call瑰排。Request后面再說(shuō)。
Call call = mClient.newCall(Request request)
3 . 最后call執(zhí)行excute同步執(zhí)行暖侨,enqueue異步執(zhí)行
call.enqueue(Callback calBack)//異步執(zhí)行
或者Response res = call.excute();//線程阻塞

3.1 Callback中重寫兩個(gè)方法

new Callback() {
        @Override public void onFailure(Request request, Throwable throwable) {
              throwable.printStackTrace();
                }
        @Override public void onResponse(Response response) throws IOException {
               //對(duì)response處理
                }

3.2 上面的Response代表Http請(qǐng)求的響應(yīng)椭住。

  • response.body()是ResponseBody類代表響應(yīng)體,可以通過(guò)responseBody.string()獲得字符串的表達(dá)形式字逗。
  • responseBody.bytes()獲得字節(jié)數(shù)組的表達(dá)形式, 這兩種形式都會(huì)把文檔加入到內(nèi)存京郑。
  • 也可以通過(guò)responseBody.charStream()和responseBody.byteStream()返回流來(lái)處理。
4 . Request主要通過(guò)Request.Builder來(lái)構(gòu)建
Request.Builder() builder = new Request.Builder();

GET請(qǐng)求

Request request = builder.url(url)//請(qǐng)求地址
                         .get()//請(qǐng)求方法葫掉,不寫默認(rèn)GET方法
                         .build();

POST請(qǐng)求

Request request = builder.url(url)
                         .Post(RequestBody requestBody)//這個(gè)就是請(qǐng)求體
                         .build();

4.1 RequestBody的構(gòu)建
從需求分析有:表單提交些举、文件提交,字符串挖息,前面幾種的組合提交金拒。

  1. 表單
 RequestBody requestBody = new FormBody.Builder()
                                       .add("q", "bilibili")//此處應(yīng)為鍵值對(duì)
                                       .add("page","1")
                                       .build();
  1. 字符串
RequestBody requestBody = RequestBody.create(mMediaType, string)
        //POST提交文件需要請(qǐng)求頭里加上文件的類型
        //MediaType表示了文件類型
        //可以這樣寫 ,表示是text中的x-markdowm類型套腹,字符集為UTF-8
        //MediaType mMediaType = MediaType.parse("text/x-markdown; charset=utf-8");
  1. 文件
File file = new File();
RequestBody requestBody = RequestBody.create(mMediaType, file)
  1. io流
 RequestBody requestBody = new RequestBody() {
        @Override public MediaType contentType() {
                  return mMediaType;
         }
        @Override public void writeTo(BufferedSink sink) throws IOException {
                          //sink上傳數(shù)據(jù)流
          }
}
  1. 組合分塊提交
 RequestBody requestBody = new MultipartBody.Builder()
                      .setType(MultipartBody.FORM)
                      .addFormDataPart("title", "name")
                      .addFormDataPart("image", "icon.jpg",RequestBody.create(mMediaType, new File(".../icon.jpg")))
                      .build();
               //本次提交了用戶名和圖片
5. 緩存
  在創(chuàng)建OKHttpClient后調(diào)用OKHttpClient .setCache(Cache cache)可以設(shè)置緩存绪抛。也可以使用OkHttpClient.Builder設(shè)置更多其他屬性。
                
      File cache = getExternalCacheDir();
         int cacheSize = 10 * 1024 * 1024;//10M
         OkHttpClient.Builder builder = new OkHttpClient.Builder()
                 .connectTimeout(15, TimeUnit.SECONDS)//超時(shí)
                 .writeTimeout(20, TimeUnit.SECONDS)
                 .readTimeout(20, TimeUnit.SECONDS)
                 .cache(new Cache(cache.getAbsoluteFile(), cacheSize));
         OkHttpClient mOkHttpClient=builder.build();

在使用了緩存后电禀,如果已經(jīng)緩存了請(qǐng)求結(jié)果幢码,第二次將直接讀取緩存,而不會(huì)連接網(wǎng)絡(luò)再次請(qǐng)求尖飞。當(dāng)我們需要網(wǎng)站數(shù)據(jù)更新了就獲取不了最新數(shù)據(jù)症副,所以在Request.Builder中可以使用chacheControl(ChacheControl.FORCE_NETWORK )Request強(qiáng)制使用網(wǎng)絡(luò)獲取數(shù)據(jù)而不使用緩存店雅。將ChacheControl.FORCE_NETWORK換成ChacheControl.FORCE_CACHE就是強(qiáng)制使用緩存。但是贞铣,如果沒(méi)有緩存的話闹啦,就報(bào)504錯(cuò)誤。(Request.Builder除了new一個(gè)以外辕坝,還可以通過(guò)已存在的request.newBuilder()得到)

6. 取消請(qǐng)求

當(dāng)一個(gè)call執(zhí)行了enqueue()或者excute()還沒(méi)執(zhí)行完畢窍奋,比如onResponse還沒(méi)執(zhí)行,就可以使用call.cancel()取消請(qǐng)求酱畅。否則會(huì)IOException琳袄。

7. 最后表窘,如果有什么不對(duì)的地方...厨内。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宝当,一起剝皮案震驚了整個(gè)濱河市芒帕,隨后出現(xiàn)的幾起案子占婉,更是在濱河造成了極大的恐慌菇绵,老刑警劉巖澎媒,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件至会,死亡現(xiàn)場(chǎng)離奇詭異用含,居然都是意外死亡矮慕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門啄骇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)痴鳄,“玉大人,你說(shuō)我怎么就攤上這事缸夹』狙埃” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵虽惭,是天一觀的道長(zhǎng)橡类。 經(jīng)常有香客問(wèn)我,道長(zhǎng)芽唇,這世上最難降的妖魔是什么顾画? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮匆笤,結(jié)果婚禮上研侣,老公的妹妹穿的比我還像新娘。我一直安慰自己炮捧,他們只是感情好庶诡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咆课,像睡著了一般末誓。 火紅的嫁衣襯著肌膚如雪扯俱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天喇澡,我揣著相機(jī)與錄音迅栅,去河邊找鬼。 笑死撩幽,一個(gè)胖子當(dāng)著我的面吹牛库继,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窜醉,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艺谆!你這毒婦竟也來(lái)了榨惰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤静汤,失蹤者是張志新(化名)和其女友劉穎琅催,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虫给,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藤抡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抹估。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缠黍。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖药蜻,靈堂內(nèi)的尸體忽然破棺而出瓷式,到底是詐尸還是另有隱情,我是刑警寧澤语泽,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布贸典,位于F島的核電站,受9級(jí)特大地震影響踱卵,放射性物質(zhì)發(fā)生泄漏廊驼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一惋砂、第九天 我趴在偏房一處隱蔽的房頂上張望妒挎。 院中可真熱鬧,春花似錦班利、人聲如沸饥漫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)庸队。三九已至积蜻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彻消,已是汗流浹背竿拆。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宾尚,地道東北人丙笋。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像煌贴,于是被迫代替她去往敵國(guó)和親御板。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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