Retrofit 是一個 RESTful 的 HTTP 網絡請求框架的封裝(基於OkHttp)。java
使用 Retrofit 能夠分爲7個步驟:git
添加 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(),參數是一個回調
注意:
baseUrl 中的url地址要以 /
結尾。
About Me