Retrofit 2.0 常用寫法示例
阿新 • • 發佈:2019-01-04
由於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"));