1. 程式人生 > >Retrofit 2.0 常用寫法示例

Retrofit 2.0 常用寫法示例

由於Retrofit的官方文件實在是很難理解,我這裡收集了一些常見的寫法,供在實際使用中參考。

對URL的處理

BASEURL

通常我們在定義retrofit的時候,會設定一個baseurl。

Retrofit.Builder builder = new Retrofit.Builder();
builder.baseUrl(mBaseUrl);

在2.0中,url的拼接規則與網頁中的<a href="url"></a>相同。如果寫過網頁的同學,就不會太陌生。

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

為了書寫時不易出錯,推薦在baseurl的後面加上‘/’

請求URL

我們知道,請求通常有GET或POST:

public interface AppListApi {

    @GET("applist/apps/")
    Call<ResponsePojo> getList();

    @POST("applist/mini/")
    Call<ResponsePojo> getMiniApp();
}

在2.0中,GET和POST中的地址可以是絕對路徑,

  @GET("http://www.baidu.com/applist/apps/")
  Call<ResponsePojo> getList();

當然,路徑也可以是動態的,根據引數進行修改。

  @GET("applist/apps/{appid}/detail")
  Call<ResponsePojo> getDetail(@Path ("appid") String appid);

除此之外,還可以單獨為每個請求動態傳入URL地址

    @GET("wallpapers/")
    Call<WallPaperPojo> getWallPaper(@Url String url, @Query("offset") int offset, @Query("limit") int limit);

GET

GET請求比較簡單

固定引數

  @GET("applist/apps/detail?type=software")
  Call<ResponsePojo> getDetail();

動態引數

  @GET("applist/apps/detail")
  Call<ResponsePojo> getDetail(@Query ("type") String type);

對null的支援,如果在實際呼叫的時候傳一個null, 系統也不會出錯,會把這個引數當作沒有。

當然如果有多個引數

  @GET("applist/apps/detail")
  Call<ResponsePojo> getDetail(@Query ("type") String type, @Query("appid") String appid);

對於引數名稱不固定的情況可以使用Map

  @GET("applist/apps/detail")
  Call<ResponsePojo> getDetail(@QueryMap Map<String, String> param);

當然,還可以支援固定引數與動態引數的混用

  @GET("applist/apps/detail?type=detail")
  Call<ResponsePojo> getDetail(@Query("appid") String appid);

系統會自動按照規範串接在URL後面

HEADER的修改

固定新增Header

  @Headers("Accept-Encoding: application/json")

  @GET("applist/apps/detail?type=detail")
  Call<ResponsePojo> getDetail(@Query("appid") String appid);

動態新增Header

  @Headers("Accept-Encoding: application/json")

  @GET("applist/apps/detail?type=detail")
  Call<ResponsePojo> getDetail(@Header ("Accept-Encoding") String appid);

多個Header

  @Headers({
    "X-Foo: Bar",
    "X-Ping: Pong"
  })
  @GET("applist/apps/detail?type=detail")
  Call<ResponsePojo> getDetail(@Header ("Accept-Encoding") String appid);

固定與動態的Header的混合

  @Headers("Accept-Encoding: application/json")

  @GET("applist/apps/detail?type=detail")
  Call<ResponsePojo> getDetail(@Header ("Location") String appid);

POST

自定義的上傳的引數

  @POST("applist/apps/detail")
  Call<ResponsePojo> sendDetail(@Body RequestBody requestData);

使用RequestBody.create來建立自定義的資料體

對於表單形式的上傳,使用註解FormUrlEncoded+Field

  @FormUrlEncoded
  @POST("applist/apps/detail")
  Call<ResponsePojo> sendDetail(@Field("name1") String name1);

當然,動態的表單可以使用Map

  @FormUrlEncoded
  @POST("applist/apps/detail")
  Call<ResponsePojo> sendDetail(@FieldMap Map<String, String> names);

MutilPart

  @Multipart
  @POST("applist/apps/detail")
  Call<ResponsePojo> sendDetail(@Part("name1") String name1,@Part("name2") String name2);

動態的寫法

  @Multipart
  @POST("applist/apps/detail")
  Call<ResponsePojo> sendDetail(@PartMap Map<String, String> names);

上傳檔案

 //上傳檔案
    @POST("applist/apps/detail")
    Call<ResponseResult> sendFile(RequestBody fileRequest);
     appListApi.sendFile(RequestBody.create(MediaType.parse("text/html"), new File("/sdcard/test.html")));

上傳多個檔案示例

    @Multipart
    @POST("applist/apps/detail")
    Call<ResponseResult> sendFile(@Part("filename=test1") RequestBody fileRequest1 ,@Part("filename=test2") RequestBody fileRequest2);
//上傳多個檔案示例
        appListApi.sendFile(RequestBody.create(MediaType.parse("text/html"), new File("/sdcard/test.html")),RequestBody.create(MediaType.parse("text/html"), new File("/sdcard/test.html"));