okhttp使用備忘錄

前言

OkHttp是目前使用最廣泛的移動端網(wǎng)絡底層庫。在Volley魁巩、Retrofit等知名上層網(wǎng)絡庫中,都可以看到它的身影。即使在高版本的Android系統(tǒng)中的URLConnection中也可以看到它的身影峻村。?

因為,各大網(wǎng)絡庫對OkHttp進行了封裝锡凝。我們雖然使用方便粘昨,卻不免失去了一定的靈活性。如果OkHttp擁有的功能,上層庫卻沒有封裝张肾,我們在使用時芭析,就會比較麻煩。因此吞瞪,我們在這里嘗試直接使用OkHttp馁启,看看未經(jīng)封裝的OkHttp如何使用。

Request

OkHttp將請求封裝在了Request類中尸饺。我們大致看看Request的成員:

public final class Request{
    private final HttpUrl url;
    private final String method;
    private final Headers headers;
    private final RequestBody body;
    private final Object tag;
}

其中HttpUrl類代表請求地址, String method代表請求方法, Headers代表請求頭, RequestBody代表請求體. Object tag是用來取消http請求的標志, 這個我們先不管.

我們在使用OkHttp時已亥,我們可以用Request提供的Builder生成我們想要的Request。

final Request request = new Request.Builder().url("https://github.com/").build();

完成Request的創(chuàng)建后蓬网,我們可以調(diào)用:

final Request request = new Request.Builder().url("https://github.com/").build();
Response response = client.newCall(request).execute();

Request被調(diào)用的方式诞丽,我們可以發(fā)現(xiàn),這是一個同步網(wǎng)絡請求迹栓。請求完成后掉分,會直接返回Response給我們。下面克伊,我們就來看看Response的結(jié)構(gòu)酥郭。

Response

public final class Response{
  private final Request request;
  private final Protocol protocol;
  private final int code;
  private final String message;
  private final HandShake handShake;
  private final Headers headers;
  private final ResponseBody body;
  private Response networkResponse;
  private Response cacheResponse;
  private final Response priorResponse;
}

可以看到Response類里面有Protocol代表請求協(xié)議, int code代表響應碼, String message代表描述信息, Headers代表響應頭, ResponseBody代表響應體. 當然除此之外, 還有Request代表持有的請求, Handshake代表SSL/TLS握手協(xié)議驗證時的信息, 這些額外信息我們暫時不問.

介紹完RequestResponse兩個重要的類,下面我們可看看愿吹,OkHttp的各種請求的調(diào)用方法不从。

GET請求

同步GET

同步GET的意思是一直等待http請求, 直到返回了響應. 在這之間會阻塞進程, 所以通過get不能在Android的主線程中執(zhí)行, 否則會報錯。

private final OkHttpClient client = new OkHttpClient();

public void run() throw Exception{
  Request request = new Request.Builder()
        .url("https://github.com/")
        .build();

  Response response = client.newCall(request).execute();      
}

異步GET

異步GET的意思是OkHttp會幫我們另外開啟后臺線程發(fā)送http請求犁跪,開啟后臺線程后椿息,不再阻礙當前線程的執(zhí)行。當http請求完成后坷衍,會以回調(diào)的方式寝优,將請求結(jié)果返回到當前線程。

private final OkHttpClient client = new OkHttpClient();

public void run() throw Exception{
  Request request = new Request.Builder()
        .url("https://github.com/")
        .build();

  Response response = client.newCall(request).enqueue(new Callback(){

    @Override
    public void onResponse(Response response) throw IOException{

    }

    @Override
    public void onFailure(Request request , Throwable throwable){

    }
  });      
}

POST請求

在上面的GET請求的介紹中枫耳,我們已經(jīng)分別介紹了同步請求和異常請求乏矾。在POST請求的介紹中,我們不再以同步和異步進行分類迁杨,只介紹同步情況钻心,而把精力集中在,POST上傳的內(nèi)容形式的分類上仑最。

POST提交String

private final OkHttpClient client = new OkHttpClient();

public void run() throw Exception{

  String uploadInfo = "Need to Upload!";

  Request request = new Request.Builder()
        .url("https://github.com/")
        .post(RequestBody.create("text/x-markdown; charset=utf-8" , uploadInfo))
        .build();

  Response response = client.newCall(request).execute();      
}

POST提交文件

private final OkHttpClient client = new OkHttpClient();

public void run() throw Exception{

  File file = new File("README.md")扔役;

  Request request = new Request.Builder()
        .url("https://github.com/")
        .post(RequestBody.create("text/x-markdown; charset=utf-8" , file))
        .build();

  Response response = client.newCall(request).execute();      
}

POST提交表單

private final OkHttpClient client = new OkHttpClient();

public void run() throw Exception{

  RequestBody formBody = new formBody.Builder()
      .add("user" , "oldFrog")
      .build();

  Request request = new Request.Builder()
        .url("https://github.com/")
        .post(formBody)
        .build();

  Response response = client.newCall(request).execute();      
}

POST提交分塊請求

private final OkHttpClient client = new OkHttpClient();

public void run() throw Exception{

  RequestBody requestBody = new MultipartBody.Builder()
      .setType(MultipartBody.FORM)
      .addFormDataPart("user" , "oldFrog")
      .addFormDataPart("image" , "logo.png" , RequestBody.create(MEDIA_TYPE_PNG, new File("local_logo.png")))    
      .build();

  Request request = new Request.Builder()
        .url("https://github.com/")
        .post(requestBody)
        .build();

  Response response = client.newCall(request).execute();      
}

POST提交Stream

private static final MediaType MEDIA_TYPE_PLAINTEXT = MediaType
    .parse("text/plain; charset=utf-8");
  private final OkHttpClient client = new OkHttpClient();
 
  @Test
  public void testPostStream() throws Exception {
 
    RequestBody requestBody = new RequestBody() {
      @Override
      public MediaType contentType() {
        return MEDIA_TYPE_PLAINTEXT;
      }
 
      @Override
      public void writeTo(BufferedSink sink) throws IOException {
 
        File file = new File("src/test/resources/Lorem Ipsum.txt");
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
          String line;
          while ((line = br.readLine()) != null) {
            sink.writeUtf8(line);
          }
        }
      }
 
    };
 
    Request request = new Request.Builder()
      .url("http://httpbin.org/post")
      .post(requestBody)
      .build();
 
    Response response = client.newCall(request).execute();
   }

至此,就介紹了okhttp的基本使用警医。后面會開始分析okhttp的源碼亿胸,以深入其進階使用坯钦。
如有問題,歡迎指正侈玄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婉刀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子序仙,更是在濱河造成了極大的恐慌突颊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潘悼,死亡現(xiàn)場離奇詭異律秃,居然都是意外死亡,警方通過查閱死者的電腦和手機治唤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門棒动,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宾添,你說我怎么就攤上這事船惨。” “怎么了缕陕?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵粱锐,是天一觀的道長。 經(jīng)常有香客問我扛邑,道長怜浅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任蔬崩,我火速辦了婚禮海雪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舱殿。我一直安慰自己,他們只是感情好险掀,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布沪袭。 她就那樣靜靜地躺著,像睡著了一般樟氢。 火紅的嫁衣襯著肌膚如雪冈绊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天埠啃,我揣著相機與錄音死宣,去河邊找鬼。 笑死碴开,一個胖子當著我的面吹牛毅该,可吹牛的內(nèi)容都是我干的博秫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼眶掌,長吁一口氣:“原來是場噩夢啊……” “哼挡育!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起朴爬,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤即寒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后召噩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體母赵,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年具滴,在試婚紗的時候發(fā)現(xiàn)自己被綠了凹嘲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡抵蚊,死狀恐怖施绎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贞绳,我是刑警寧澤谷醉,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站冈闭,受9級特大地震影響俱尼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萎攒,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一遇八、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耍休,春花似錦刃永、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喧锦,卻和暖如春读规,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背燃少。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工束亏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阵具。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓碍遍,卻偏偏與公主長得像定铜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雀久,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

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