Retrofit2

前言

Retrofit在個人理解是針對於okhttp的二次封裝,它支持反序列化來解析數據,支持Rxjava,具備強大的可擴展性java

Retrofit2.0註解

看Retrofit的源碼發現共有有24個註解類,其中8個爲請求方法類,13個參數類,3個標記類json

請求方法

1.HTTP後端

這一個比較特殊,他能夠代替其餘的七個請求方法,提供了三個屬性 method,path,hasBody api

HTTP註解類

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 用於大文件下載的時候

Retrofit2.0基本使用

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) {
                //失敗
            }
        });
複製代碼

Retrofit2.0結合Rxjava2使用

結合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持久化等等設置

相關文章
相關標籤/搜索