Retrofit 2.0 的使用

Retrofit 是一個 RESTful 的 HTTP 網絡請求框架的封裝(基於OkHttp)。java

Retrofit 使用介紹

使用 Retrofit 能夠分爲7個步驟:git

    1. 添加 Retrofit 庫的依賴
    1. 建立接收服務器返回數據的類
    1. 建立用於描述網絡請求的接口
    1. 建立 Retrofit 實例
    1. 建立網絡請求接口實例
    1. 發送網絡請求(同步/異步)
    1. 處理返回的數據

添加 Retrofit 庫依賴github

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
複製代碼

經常使用參數註解

  • @GET、@POST、@PUT、@DELETE、@HEAD:肯定請求方式json

  • @Path:請求URL的字符替代bash

  • @Query:要傳遞的參數服務器

  • @QueryMap:包含多個@Query註解參數網絡

  • @Body:添加實體類對象app

  • @FormUrlEncoded:URL編碼框架

GET 請求異步

@GET("users/list")

@GET("users/list?sort=desc")

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
複製代碼

如何使用 @POST 請求,還能夠和 @FormUrlEncoded 註解一塊兒使用,表示將發送表單編碼數據。每一個鍵值對都使用包含名稱的 @Field 和提供值的對象進行註釋。

示例以下:

@POST("users/new")
Call<User> createUser(@Body User user);

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
複製代碼

當方法中存在 @Multipart 時,將使用多部分請求。使用 @Part 註釋聲明部件。

示例以下:

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
複製代碼

您能夠使用@Headers批註爲方法設置靜態標頭。

@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
複製代碼
@Headers({
    "Accept: application/vnd.github.v3.full+json",
    "User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);
複製代碼

請注意,標頭不會相互覆蓋。全部具備相同名稱的標頭都將包含在請求中。

能夠使用 @Header 註釋動態更新請求標頭。必須爲 @Header 提供相應的參數。若是該值爲null,則將省略標頭。不然,將在值上調用toString,並使用結果。

@GET("user")
Call<User> getUser(@Header("Authorization") String authorization) @GET("user") Call<User> getUser(@HeaderMap Map<String, String> headers) 複製代碼

Retrofit 2.0 來設置攔截器,只能經過OkHttp來實現,無論是在1.x仍是2.0,這種方式都是比較推薦的。

OkHttpClient.Builder okBuilder = new OkHttpClient().newBuilder();
okBuilder.addNetworkInterceptor(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request original = chain.request();
        Request.Builder requestBuilder = original.newBuilder().addHeader("Accept", "application/json");
        Request request = requestBuilder.build();
        return chain.proceed(request);
        }
    });
okHttpClient = okBuilder.build();
複製代碼

發送請求

  • 同步:調用 Call 對象的 execute(),返回結果的響應體

  • 異步:調用 Call 對象的 enqueue(),參數是一個回調

總結

    1. Retrofit 是基於 OkHttp 網絡庫的高級封裝。
    1. 採用註解、網絡請求參數配置更靈活、擴展性更好。
    1. 採用 RESTful 風格的 API 。

注意:

baseUrl 中的url地址要以 / 結尾。






About Me

相關文章
相關標籤/搜索