1. 程式人生 > >Retrofit2+okHttp3使用樣例

Retrofit2+okHttp3使用樣例

在這裡為大家介紹下Retrofit2+okHttp3這個目前較為流行網路框架的使用過程,gradle新增依賴過程不再敘述,這裡只介紹請求,檔案的上傳下載本篇不表。

本文針對的讀者群體為沒使用過Retrofit於okHttp的開發人員,老司機可以直接拉到評論區,為新手指點迷津。

閒話少敘,直接上步驟:

retrofit在使用前要定義一個介面,在介面中根據需求,以註解方式寫方法,下面簡單寫一個get請求:

  • public interface HttpInterface
    {
        @GET("splash")
        Call<ResponseBody> getSplashUrl();
    }

大家可以看到,我定義了一個方法,getSplashUrl,這裡咱們把他理解為獲取閃屏頁面圖片地址的方法,通過@GET註解,表示為該請求為GET請求,註解後面的value,也就是“splash”,是部分url,為什麼說是部分呢,因為它要和Retrofit配置物件時填寫的baseUrl組成完整url,baseUrl我們稍後敘述。這裡介紹下請求方式註解,常用的有@POST和@GET,根據字面意思很好理解,是post請求和get請求。說到這裡,咱們要說一下向後臺提交引數的方法。先說下通過Url動態傳參。

public interface HttpInterface
{
    @GET("user/{userid}")
    Call<ResponseBody> getUser(@Path("userid") String userid);
}
大家將上面程式碼理解為一個獲取使用者詳情的介面,說下上面程式碼段的關鍵點 ,大家應該注意到了,@GET註解後的value中,有一對大括號,{userid},在這裡,這對大括號相當於佔位符,與方法中@Path註解後的value相對應,@Path註解後緊跟著一個一個引數,使我們要動態組合url時需要的引數。呼叫以上方法,傳入相應的使用者id,即可組成如下的url地址: http://xxxxxxxx/user/userid,從而達到直接訪問相應url獲取使用者資訊的目的。

接下來講解下Post傳參方式,目前我接觸到的有兩種,一種是查詢引數,也就是一般的傳參,另一種是表單傳參,先說下查詢傳參,不多說,上例子。

<pre name="code" class="java">public interface HttpInterface
{
    @POST("users")
    Call<ResponseBody> getUser(@Query("userid") String userid);
}

老規矩,說幾個關鍵點,@Query註解,這個註解是新增引數用的,註解的value是引數名,這個要和後臺統一,後面緊跟的引數動態傳入的引數值,利用此方法,可以達到向後臺提交引數userid,獲取使用者詳情的目的。

再說下表單傳參,不多說,上程式碼。

public interface HttpInterface
{
    @POST("users")
    @FormUrlEncoded
    Call<ResponseBody> getUser(@Field("userid") String userid);
}

關鍵點,大家可能已經注意到,在@POST註解下,又加入了@FormUrlEncoded註解,加入該註解,表示以表單的形式向後臺傳入鍵值對引數。與@Query同理,在表單傳參時替換為@Field,作用相同。

下面再說一種傳參方式,也是開發中較為常用的方式,講Json字串以Body的形式提交到後臺。(我發現我前面有個字打錯了,但是我不想改- -)這種請求方式怎麼做呢,不多說,上程式碼 ,程式碼直觀。

public interface HttpInterface {

    @POST("user_login")
    Call<String> login(@Body RequestBody body);
    
}

這裡注意下方法引數中的註解@Body 表示將引數新增到請求體body中,提交到伺服器,特別注意下註解後的引數 是一個RequestBody,稍後會說到。

-------------------------------分割線,我就不放中間,逼死強迫症--------------------------------------------------------------------------------------------------------------------------------------------------------

上面說完了請求介面的常用書寫方式,下面介紹下Retrofit的配置以及呼叫

先說配置,上程式碼。

 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://xxx/xxx")
                .addConverterFactory(YourConverter.create())
                .client(OkHttpClient)
                .build();

講一下幾個引數,第一個baseUrl,這個引數是我們請求介面的根目錄,與請求介面中註解後的value組成完整Url,第二個引數是轉換器,用於將請求結果轉換為我們需要的資料格式,常用的有如下幾種:
  • Gsoncom.squareup.retrofit2:converter-gson
  • Jacksoncom.squareup.retrofit2:converter-jackson
  • Moshicom.squareup.retrofit2:converter-moshi
  • Protobufcom.squareup.retrofit2:converter-protobuf
  • Wirecom.squareup.retrofit2:converter-wire
  • Simple XMLcom.squareup.retrofit2:converter-simplexml
  • Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

以上摘自squareup官網,大家可能注意到,我前面寫的例項中,請求方法返回值為Call型別,泛型為<ResponseBody>,這個型別是預設型別,也就是在構造時沒有新增轉換器預設返回的型別,請求回來的內容為伺服器返回結果body中的內容,如需要返回自定義的javabean物件,可新增相應的轉換器,例如Gson、Jackson等。

第三個引數是設定okhttp的Client。雖然retrofit2之後用的是ok核心,但是有的時候我們還是需要配置,因為大多數情況下我們需要檢視網路請求日誌,以及配置快取大小,快取目錄等內容。

下面到了重頭戲,如何發起請求。看程式碼

        HttpInterface service = retrofit.create(HttpInterface.class);

這裡我們建立了一個介面物件service,固定寫法,不解釋。然後如下
Call<ResponseBody> call = service.getUser(userid);
建立一個Call物件,並以介面方法返回值賦值。繼續往下看。
 call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                 
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
               
            }
        });

看到這大家可能比較熟悉了,這裡就很像以往常用的網路框架的結構了。call物件呼叫了enqueue方法,傳入了一個回撥物件,實現對網路請求成功與失敗的狀態監聽與事件處理,這裡說一下,enqueue是非同步請求,同步請自行百度,用法相同。

囉裡囉嗦,簡單介紹了一下Retrofi+okHttp用法,我也是最近才使用此框架,如有錯誤,望指正。