網路請求框架之Retrofit2.0基本講解

LeiHolmes發表於2017-10-31

Retrofit2.0簡介

  Retrofit是一套RESTful架構的Android(Java)客戶端實現,基於註解,提供JSON to POJO(Plain Ordinary Java Object,簡單Java物件),POJO to JSON,網路請求(POST,GET,PUT,DELETE等)封裝。用官方自己的介紹就是:

A type-safe REST client for Android and Java

  現已更新到2.0的版本,與1.0版本的使用上還是不小的差別,我也是第一次用,這裡主要和大家研究研究2.0版本簡單使用。也可參詳官方示例

準備工作

新增許可權

  首先新增網路請求許可權

<uses-permission android:name="android.permission.INTERNET"/>複製程式碼

新增依賴

  Retrofit2.0版本後只支援okhttp請求,也已經封裝好了,就不需要新增okhttp的依賴了。

dependencies {
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'
}複製程式碼

簡單使用

  接下來瞧一瞧Retrofit初始化以及如何請求資料。

初始化Retrofit物件

public static final String BASE_URL = "https://api.github.com/";
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();複製程式碼

  BASE_URL就是你請求的Server地址。

.addConverterFactory(GsonConverterFactory.create())複製程式碼

  Retrofit2.0不提供返回JSON資料的預設解析方式,需要手動指定,支援Jackson等多種解析方式。需要哪種就新增相應的依賴,這裡新增的是Retrofit提供的converter-gson依賴。有點不爽的就是不支援FastJson解析,有需要的話可以自己寫一個FastjsonConverterFactory繼承Converter.Factory實現。
  雖然Retrofit2.0後只支援okhttp請求,但你也可以自定義一個okhttp再配置進Retrofit。

OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
            Response response = chain.proceed(chain.request());
            // Do anything with response here
            return response;
        }
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(client)
        .addConverterFactory(GsonConverterFactory.create())
        .build();
});複製程式碼

定義請求介面

  實現轉換HTTP API為Java介面,Retrofit提供了5種內建的註解:GET、POST、PUT、DELETE和HEAD,在註解中指定的資源的相對URL。

public interface NetWorkService {
    @GET("users/basil2style")
    Call<DataBean> getData();
}複製程式碼

  使用替換塊和引數進行動態更新,替換塊是{ and }包圍的字母數字組成的字串,相應的引數必須使用相同的字串被@Path進行註釋。

@GET("repos/{params1}/{params2}/contributors")
Call<List<DataBean2>> getData(
        @Path("params1") String params1,
        @Path("params2") String params2,
);複製程式碼

  當我們呼叫getData()這個方法的時候,Retrofit會建立這個URL。如果我們傳入Square和Retrofit字串,分別作為owner和repo引數。我們就會得到這個URL:api.github.com/repos/squar…
  新增查詢引數

@GET("repos/square/{retrofit}/contributors")
Call<List<DataBean2>> groupData(@Path("retrofit") String retrofit, @Query("sort") String sort);複製程式碼

  當我們呼叫getData()方法時,傳入一個查詢引數字串"ok",這樣我們就能得到URL:api.github.com/repos/squar…
  當然如果查詢引數過多,我們也可以使用Map進行組合再傳進來。

@GET("repos/square/{retrofit}/contributors")
Call<List<DataBean2>> getData(@Path("repos") String repos, @QueryMap Map<String, String> parameters);複製程式碼

請求資料

  Retrifot支援同步和非同步的請求方式,先使用Retrofit類生成介面NetWorkService的實現。

NetWorkService service = retrofit.create(NetWorkService.class);複製程式碼
同步請求
Call<DataBean> call = service.getData(Square,Retrofit);
DataBean bean = call.execute().body();複製程式碼

  注意同步請求不可在主執行緒執行,你懂得。且call只能執行execute()方法一次,若要再次請求可通過Call<DataBean> call = call.clone()來再複製一個Call物件。

非同步請求
call.enqueue(new Callback<DataBean>() {
    @Override
    public void onResponse(Call<DataBean> call, Response<DataBean> response) {
        Toast.makeText(MainActivity.this, "請求成功", Toast.LENGTH_SHORT).show();
        DataBean bean = response.body();
        tvMain.setText(bean.toString());
    }
    @Override
    public void onFailure(Call<DataBean> call, Throwable t) {
    }
});複製程式碼

  當我們執行的同步或非同步加入佇列後,可以隨時使用call.cancel()方法取消請求。

注意

  註解中引數的寫法與BASE_URL的拼接一定要注意,請看以下寫法。

錯誤示例1

  BASE_URL:api.github.com/repos/squar…
  Get註解: @GET("/basil2style")
  結果URL: api.github.com/basil2style

錯誤示例2

  BASE_URL:api.github.com/repos/squar…
  Get註解: @GET("basil2style")
  結果URL: api.github.com/repos/basil…

推薦寫法

  BASE_URL:api.github.com/repos/squar…
  Get註解: @GET("basil2style")
  結果URL: api.github.com/repos/squar…

總結

  Retrofit2.0的基本實現講解完畢,Retrofit+Okhttp+Gson可以算是目前來說相當快的超級網路請求框架了。相比較於Volley都快不少,親測結果很爽。小夥伴們趕緊整起來吧!
  技術渣一枚,有寫的不對的地方歡迎大神們留言指正,有什麼疑惑或者不懂的地方也可以在我Github上Retrofit2Demo專案的Issues中提出,我會及時解答。附上Retrofit2Demo的地址:
  Retrofit2Demo

相關文章