1. 程式人生 > >OkHttp各種請求方法

OkHttp各種請求方法

支援 SPDY ,共享同一個 Socket 來處理同一個伺服器的所有請求

  1. 如果 SPDY 不可用,則通過連線池來減少請求延時

  2. 無縫的支援GZIP來減少資料流量

  3. 快取響應資料來減少重複的網路請求

  OkHttp 處理了很多網路疑難雜症:會從很多常用的連線問題中自動恢復。如果您的伺服器配置了多個IP地址,當第一個IP連線失敗的時候,OkHttp會自動嘗試下一個IP。OkHttp還處理了代理伺服器問題和SSL握手失敗問題。

  OkHttp是一個相對成熟的解決方案,據說Android4.4的原始碼中可以看到HttpURLConnection已經替換成OkHttp實現了。所以我們更有理由相信OkHttp的強大。


一、測試使用我們的OKHttp第三方庫

1.第一步我們需要去建立一個 OKHttpClient 物件

OkHttpClient okHttpClient = new OkHttpClient();

2.下一步我們還需要一個 Request 物件,她可以已如下方式被建立

Request request = new Request.Builder()
                                    .url(requestUrl)
                                    .build(); 

requestUrl是一個字串變數代表這個URL是為了JSON請求(The requestUrl is a String variable representing the Url for the JSON request.) 

在這個測試中,我們將會使用如下的URl:http://iheartquotes.com/api/v1/random?format=json

3.再下一步我們需要例項化一個 Call 物件

Call call  = okHttpClient.newCall(request);

Call物件會取走我們的 okHttpClient物件 和 我們的 request

物件。

4.在例項化Call物件後,我們現在可以 Execute(執行)她。Executing一個Call後將會返回一個 Response,並且會丟擲一個 IOException的異常,這就是為什麼們會用一個try,catch塊包裹她。

複製程式碼
try{
        Response response = call.execute();
}catch (IOException e){
        e.printStackTrace();
}
複製程式碼

5.執行完我們的Call後,我們需要通過使用 response.isSuccessful()來檢查Call物件是否執行成功,

通過response.isSuccessful()的返回值為true或者是false來判斷。

這我們僅僅是一個測試,如果Call成功的話,我們將會通過Log來列印我們的response。

複製程式碼
try{
        Response response = call.execute();
        if(response.isSuccessful()){
                //The call was successful.print it to the log
                Log.v("OKHttp",response.body().string());
        }
    }catch(IOException e){
        e.printStackTrace();
}
複製程式碼

6.測試Code!

這是新手一個常見的錯誤。在Android中不允許任何網路的互動在主執行緒中進行。It disallows it to force developers to use asynchronous callbacks.(能力有限這句話不敢強譯)。但是現在,我們的程式碼看起來看起來十分的號好!下面我們來看看如何修復這個問題。

7.Fix issue

為了修補這個問題,我們只需要讓我們的Call執行在非主執行緒內,所以利用一個 asynchronous callback(非同步的callBack)

讓我們call非同步的方法是通過呼叫我們Call物件的 enqueue()方法。

複製程式碼
call.enqueue(new Callback()) {
        
        @Override
        public void onFailure( Request request, IOException e ) {
        
        }
        
        @Override
        public void OnResponse( Response response) throws IOException {
                try {
                        if(response.isSuccessful()){
                            //The call was successful. print it to the log
                            log.v("OKHttp",response.body.string());
                         }
                }catch (IOException e) {
                    e.printStackTrace();
                }
        }
});
複製程式碼

8.在我們再次執行我們的code之前,我們還需要再改一改。如果我們想要現在執行她,我們可能還會接收到錯誤的提示,因為我們應用的程式沒有得到相應的相應的網路許可權。所以我們需要再AndroidManifest.xml中新增應用許可權。

<uses-permission android:name="android.permission.INTERNET"/>

9.當我們執行完code後,我們將接受到如下的log輸出:

10.This means, we are now able to execute asynchronous network calls and use the data inside the callback method, when it is ready!

onResponse回撥的引數是response,一般情況下,比如我們希望獲得返回的字串,可以通過response.body().string()獲取;如果希望獲得返回的二進位制位元組陣列,則呼叫response.body().bytes();如果你想拿到返回的inputStream,則呼叫response.body().byteStream()

看到這,你可能會奇怪,竟然還能拿到返回的inputStream,看到這個最起碼能意識到一點,這裡支援大檔案下載,有inputStream我們就可以通過IO的方式寫檔案。不過也說明一個問題,這個onResponse執行的執行緒並不是UI執行緒。的確是的,如果你希望操作控制元件,還是需要使用handler等

二、請求方法介紹

1、HTTP請求方法

  • 同步GET請求

  1. privatefinal OkHttpClient client = new OkHttpClient();  
  2. publicvoid run() throws Exception {  
  3.     Request request = new Request.Builder()  
  4.             .url("http://publicobject.com/helloworld.txt")  
  5.             .build();  
  6.     Response response = client.newCall(request).execute();  
  7.     if (!response.isSuccessful())  
  8.         thrownew IOException("Unexpected code " + response);  
  9.     Headers responseHeaders = response.headers();  
  10.     for (int i = 0; i < responseHeaders.size(); i++) {  
  11.         System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));  
  12.     }  
  13.     System.out.println(response.body().string());  
  14. }  

  Response類的string()方法會把文件的所有內容載入到記憶體,適用於小文件,對應大於1M的文件,應   使用流()的方式獲取。

  1. response.body().byteStream()  
  • 非同步GET請求

  1. privatefinal OkHttpClient client = new OkHttpClient();  
  2. publicvoid run() throws Exception {  
  3.     Request request = new Request.Builder()  
  4.             .url("http://publicobject.com/helloworld.txt")  
  5.             .build();  
  6.     client.newCall(request).enqueue(new Callback() {  
  7.         @Override
  8.         publicvoid onFailure(Request request, IOException e) {  
  9.             e.printStackTrace();  
  10.         }  
  11.         @Override
  12.         publicvoid onResponse(Response response) throws IOException {  
  13.             if (!response.isSuccessful()) {  
  14.                 thrownew IOException("Unexpected code " + response);  
  15.             }  
  16.             Headers responseHeaders = response.headers();  
  17.             for (int i = 0; i < responseHeaders.size(); i++) {  
  18.                 System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));  
  19.             }  
  20.             System.out.println(response.body().string());  
  21.         }  
  22.     });  
  23. }  

  讀取響應會阻塞當前執行緒,所以發起請求是在主執行緒,回撥的內容在非主執行緒中。

  • POST方式提交字串

  1. privatestaticfinal MediaType MEDIA_TYPE_MARKDOWN  
  2.         = MediaType.parse("text/x-markdown; charset=utf-8");  
  3. privatefinal OkHttpClient client = new OkHttpClient();  
  4. publicvoid run() throws Exception {  
  5.     String postBody = ""
  6.             + "Releases\n"
  7.             + "--------\n"
  8.             + "\n"
  9.             + " * _1.0_ May 6, 2013\n"
  10.             + " * _1.1_ June 15, 2013\n"
  11.             + " * _1.2_ August 11, 2013\n";  
  12.     Request request = new Request.Builder()  
  13.             .url("https://api.github.com/markdown/raw")  
  14.             .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody))  
  15.             .build();  
  16.     Response response = client.newCall(request).execute();  
  17.     if (!response.isSuccessful())   
  18.         thrownew IOException("Unexpected code " + response);  
  19.     System.out.println(response.body().string());  
  20. }  

  因為整個請求體都在記憶體中,應避擴音交1M以上的檔案。

  • POST方式提交流

  1. privatefinal OkHttpClient client = new OkHttpClient();  
  2. publicvoid run() throws Exception {  
  3.     RequestBody requestBody = new RequestBody() {  
  4.         @Override
  5.         public MediaType contentType() {  
  6.             return MEDIA_TYPE_MARKDOWN;  
  7.         }  
  8. 相關推薦

    OkHttp各種請求方法

    支援 SPDY ,共享同一個 Socket 來處理同一個伺服器的所有請求 如果 SPDY 不可用,則通過連線池來減少請求延時 無縫的支援GZIP來減少資料流量 快取響應資料來減少重複的網路請求   OkHttp 處理了很

    Android——使用OkHttp(含各種請求方法

    支援 SPDY ,共享同一個 Socket 來處理同一個伺服器的所有請求 1、如果 SPDY 不可用,則通過連線池來減少請求延時 2、無縫的支援GZIP來減少資料流量 3、快取響應資料來減少重複的網路請求 OkHttp 處理了很多網路疑難雜症:會從很多常

    struts2 全局攔截器,顯示請求方法和參數

    功能 defaults i18n token override params tin back alias 後臺系統中應該須要一個功能那就是將每一個請求的url地址和請求的參數log出來,方便系統調試和bug追蹤,使用struts2時能夠使用struts2的全局攔截器實

    HTTP的請求方法一共有9種,有OPTIONS, HEAD, GET, POST等等(消息頭有圖,十分清楚)

    ram () 哪些 ive 十分 enc set utf-8 cat 請求方法:指定了客戶端想對指定的資源/服務器作何種操作 下面我們介紹HTTP/1.1中可用的請求方法: 【GET:獲取資源】 GET方法用來請求已被URI識別的資源。指定的資源經服務器端解析後返

    C#對XML文件的各種操作方法

    C# XML文件的各種操作方法 內容來自越康體育分享。 XML:Extensible Markup Language(可擴展標記語言)的縮寫,是用來定義其它語言的一種元語言,其前身是SGML(Standard Generalized Markup Language,標準通用標

    各種排序方法

    clas 各種排序 targe clu void sort return rac use 本文轉自http://blog.csdn.net/cnyali/article/details/43447771 //堆排序 #include<stdio.h>

    @RequestMapping-限定請求方法的映射

    訪問 ppi wid ges height ping 指定 http alt 限定請求方法的映射 測試: 如果非指定的請求方法訪問時會出現405狀態: @RequestMapping-限定請求方法的映射

    HTTP協議六種請求方法,get,head,put,delete,post有什麽區別

    restful 博文 存在 rac pos 信息 nbsp 和數 基本 標準Http協議支持六種請求方法,即: 1、GET 2、POST 3、PUT 4、Delete 5、HEAD 6、Options 但其實我們大部分情況下只用到了GET和POS

    各種排序方法(冒泡,快速,插入,選擇),二分查找

    highlight 查找 rip math 插入排序 end tar scrip || <script> var list = [25,15,60,24,30,70,10,9,8]; //冒泡排序 function bubble(lis

    HTTP請求方法匯總

    conn 定義 images 抓包 post請求 nec 返回 內容 不同  引:知己知彼,百戰百勝。    在基於Web的HTTP協議中,有著不同的請求放式,而現在有些特別常見的,就有必要給大家總結一下,將有用的東西匯總到一起聚合,從而整理成一些好東西。     根

    請求方法總結

    json數據 nbsp post put 方法總結 delet 輕量級 資源 提交 GET       查看資源POST       增加資源PUT       修改資源DELETE      刪除資源HEAD       查看響應頭OPTIONS     查看可用請求方

    HTTP的請求方法OPTIONS

    size 20px name 允許 trace 一個 delet 資源 獲得 HTTP請求方法並不是只有GET和POST,只是最常用的。據RFC2616標準(現行的HTTP/1.1)得知,通常有以下8種方法:OPTIONS、GET、HEAD、POST、PUT、DELETE

    springMVC學習總結(二)路徑映射和請求方法限定

    根路徑 後臺 mapping oca log alt public mes cti springMVC學習總結(二)路徑映射和請求方法限定 一、路徑映射 無參數的訪問路徑 對springmvc項目的訪問路徑,是由根路徑和子路徑組成;在註解式開發中,根路徑標註在類名之上,子

    HTTP協議----請求方法和狀態碼

    con 訪問 head per 被拒 暫時 pos ice erro 現在廣泛使用的是HTTP/1.1版本,發布於1997年。 理解HTTP協議,首先從請求開始,比如: POST /form/entry HTTP/1.1 格式為: 請求方法 URI 協議版本 請求方法:

    [總結]Perl在遇到Unicode字符文件名時的各種處理方法

    ref 路徑 進行 foreach quest error 對象 odi base 環境 XP/WIN7 Perl v5.16 編輯整理:523066680 常見的那些文件操作函數都不支持,於是為了達到目的,需要各種方法配合,應該是不如其他語言方便。 我只是想看

    Python·Jupyter Notebook各種使用方法記錄·持續更新

    question 使用 class ref not 使用方法 react article details Python·Jupyter Notebook各種使用方法記錄·持續更新 你為什麽使用 jupyterPython·Jupyter Notebook各種使用方

    GET和POST兩種基本請求方法的區別

    完整性 總結 優化 返回 們的 傳遞參數 src 本質 大成 GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把參數包含在URL中,POST通過request body傳遞參數。 你可能自己寫過

    HTTP請求方法 之 HEAD

    很多 就是 lock 有用 bank 如果 AD 請求方法 ont HTTP請求方法並不是只有GET和POST,只是最常用的。據RFC2616標準(現行的HTTP/1.1)得知,通常有以下8種方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRAC

    MVC接口式開發 封裝統一請求方法

    style pan tpm The BE webapi AR AD pub   由於公司需要用到接口式開發,所以所以業務邏輯都寫在webapi ,web端主要做調用,為了使開發方便,特此封裝出統一請求的方法,頁面調用只需寫接口地址就行,話不多說,直接上代碼。 1 pub

    latex與word之間的各種轉化方法

    接收 壓縮 eve smp mathtype targe ack 自定義列 處理程序 https://blog.csdn.net/communix/article/details/49965233 https://blog.csdn.net/yaoqi_isee/arti