Retrofit在個人理解是針對於okhttp的二次封裝,它支持反序列化來解析數據,支持Rxjava,具備強大的可擴展性java
看Retrofit的源碼發現共有有24個註解類,其中8個爲請求方法類,13個參數類,3個標記類json
1.HTTP後端
這一個比較特殊,他能夠代替其餘的七個請求方法,提供了三個屬性 method,path,hasBody api
![]()
HTTP使用方式: method:請求的方式 path:請求的路徑 (這裏會加上BaseUrl) hasBody:是否包含請求體bash
@HTTP(method = "get", path = "/address/list/{id}", hasBody = false)
Call<BaseResponse<String>> getAddressList(@Path("id") int id);
複製代碼
2.GET 3.POST 4.PUT 5.OPTIONS 6.DELETE 7.PATH 8.HEADcookie
1.Field Field是發送Post請求時的表單字段,須要與FormUrlEncoded結合使用,否則會報錯 示例:app
@POST("/addressList")
@FormUrlEncoded
Call<BaseResponse<String>> getAddressList(@Field("id") int id);
複製代碼
2.FieldMap 同上,Field只有一個參數,FieldMap能夠傳入多個參數 示例:ide
@POST("/addressList")
@FormUrlEncoded
Call<BaseResponse<String>> getAddressList(@FieldMap() Map<String,String> map);
複製代碼
3.Header 4.Headers 5.HeaderMap Header三種都是用來添加請求頭的,Header是用來添加一個請求頭的,而且該請求頭可爲空,若是爲空則忽略Headers與HeaderMap都是是用來添加一個或者多個請求頭的,HeaderMap中的map是不能夠爲空,不然將報錯 示例:ui
//Header
@POST("/addressList")
@FormUrlEncoded
Call<BaseResponse<String>> getAddressList(@Header("Accept-Language") String language,@FieldMap() Map<String,String> map);
//HeaderMap
@POST("/addressList")
@FormUrlEncoded
Call<BaseResponse<String>> getAddressList(@HeaderMap() Map<String,String> language, @FieldMap() Map<String,String> map);
//Headers
@POST("/addressList")
@FormUrlEncoded
@Headers({"YYYY: YYYY," , " XXXX: XXXX"})
Call<BaseResponse<String>> getAddressList(@FieldMap() Map<String,String> map);
複製代碼
6.Body 非表單字段,將請求參數以實體類承載,通過retrofit使其序列化,並將序列化的結果做爲請求體發出去,向後端發送Json請求參數的時候能夠用Okhttp的RequestBody將Json字符串轉成對象發送給後端 示例:編碼
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
@POST("/igrp4api/dispatch.json")
Call<BaseResponse<String>> getSystemAddress(@Body RequestBody body);
複製代碼
7.Url 用做動態Url設置 示例:
@GET
Call<BaseResponse<String>> getData(@Url String user);
複製代碼
8.Part 9.PartMap 與Field功能相同,比Field攜帶的參數更豐富,包括數據流,因此適用於文件上傳,配合Multipart註解使用,若是參數是MultipartBody則能夠不提供Part名稱,若是是其他的則須要提供Part名稱,Map不須要提供Part名稱
@POST("/addressList")
@Multipart
Call<BaseResponse<String>> getAddressList(@Part("part") String part, @Part(value = "part" ,encoding = "8-bit") RequestBody body, @Part MultipartBody multipartBody);
@POST("/addressList")
@Multipart
Call<BaseResponse<String>> getAddressLists(@PartMap() Map<String ,RequestBody> map);
複製代碼
10.Query 11.QueryMap 12.QueryName 做用於GET請求查詢參數,就是相似http://127.0.0.1:8081/addresslist?id=12&name="張三",這個請求中的id與name就是Query的字段,QueryMap就是多個參數,QueryName做用與QueryMap相似
@GET("/addressList")
Call<BaseResponse<String>> getAddressLists(@Query("id") int id,@Query("name") String name);
@GET("/addressList")
Call<BaseResponse<String>> getAddressLists(@QueryMap() Map<String,String> query);
複製代碼
13.Path 用於GET請求中路徑上替換指定的缺省值,會有一個默認的編碼,也能夠本身定義一個編碼
@GET("/addressList/{id}")
Call<BaseResponse<String>> getAddressLists(@Path("id") int id);
複製代碼
1.FormUrlEncoded 用於標記當前請求提交的數據是Form表單數據 2.Multipart
用於標記當前的請求是支持文件上傳的Form表單 3.Streaming 用於大文件下載的時候
1.定義一個接口
public interface RequestApiManager {
@GET("/addressList/{id}")
Call<BaseResponse<String>> getAddressLists(@Path("id") int id);
}
複製代碼
2.建立Retrofit對象,並調用接口方法
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(15, TimeUnit.SECONDS);
Retrofit retrofit=new Retrofit.Builder()
.client(builder.build())
.baseUrl("http://127.0.0.1:8080/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
RequestApiManager apiManager = retrofit.create(RequestApiManager.class);
apiManager.getAddressLists(12).enqueue(new Callback<BaseResponse<String>>() {
@Override
public void onResponse(Call<BaseResponse<String>> call, Response<BaseResponse<String>> response) {
//成功
}
@Override
public void onFailure(Call<BaseResponse<String>> call, Throwable t) {
//失敗
}
});
複製代碼
結合Rxjava2使用則是將call改爲observable
public interface RequestApiManager {
@GET("/addressList/{id}")
Observable<BaseResponse<String>> getAddressLists(@Path("id") int id);
}
複製代碼
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(15, TimeUnit.SECONDS);
Retrofit retrofit=new Retrofit.Builder()
.client(builder.build())
.baseUrl("http://127.0.0.1:8080/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
RequestApiManager apiManager = retrofit.create(RequestApiManager.class);
Observable<BaseResponse<String>> observable = apiManager.getAddressLists(12);
observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseResponse<String>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(BaseResponse<String> stringBaseResponse) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
複製代碼
在實際的開發中,咱們確定不是這麼簡簡單單的建立一個接口,而後建立retrofit來去請求的,確定還須要對retrofit進行封裝,還須要對其進行一些設置,好比日誌,請求頭,rxjava提供的生命週期管理,cookie持久化等等設置