Retrofit 之註解

項目裏使用的版本是  'com.squareup.retrofit2:retrofit:2.0.1' ,測版本一共37個類,其中22個是註解類,並且 Retrofit 中用到註解的邏輯也比較重要,所以這裏就註解和反射類 Method 稍作說明。

之前寫過一篇文章就是分析註解的,註解說白了就是賦值數據,在代碼中通過註解重新獲取數據,這個號理解,關於 Retrofit 中註解的作用,下面說明一下

@GET    GET 請求
@POST    POST 請求
@PUT    PUT 請求
@DELETE    DELETE 請求
@HEAD    HEAD 請求
@OPTIONS    OPTIONS 請求
@PATCH    PATCH 請求
@HTTP    作用於方法,用於發送一個自定義的HTTP請求

這裏,我們只需要知道 @GET 和 @POST 就行了,其他的暫時可以忽略不計。

@FormUrlEncoded 它用於POST請求中,我們知道表單From請求,post格式比着get格式多了個請求體,因此我們使用 @FromUrlEncoded 註解來標識,使用 @Field 或 @FieldMap 來添加參數,如果沒有在方法上面添加 @FromUrlEncoded 註解,程序會拋異常,所以post請求不能忘了這個註解,get請求則不需要它。

@Query     用於Get請求,表示拼接在Url路徑後面的查詢參數,一個@Query對應一個參數
@QueryMap    用於Get請求,相當於於多個@Query參數拼接
@Field     用於Post請求,表單字段,@Field的用法類似@Query
@FieldMap     用於Post請求,表單字段,@FieldMap的用法類似@QueryMap。
get和post請求的拼接參數是不一樣的,get是把參數拼接在url後面,post是把參數寫在請求體中。

@Headers   添加在方法上面的註解,用於添加一個或者多個Header請求頭
@Header     添加在方法形參的註解,添加一個Header請求頭
@HeaderMap    添加在方法形參的註解,添加多個Header請求頭
@Url     Url請求數據的註解,它對應的一般是網絡的url; @GET 和 @POST 這兩個註解中有個 value() 方法,可以添加一個String類型的url,這裏要注意,
@GET 和 @POST 註解中添加的值,與 @Url 中添加的值,這兩個只能二選一,不能共存,否則會拋出異常 @Url cannot be used with @GET URL (parameter #1),@Url cannot be used with @POST URL (parameter #1)


關於反射,我們知道 Method 是反射時對應的方法相關信息的類,Retrofit 中涉及到它的地方也比較多,舉個例子來說明

interface ApiService1 {

    @GET(value = "testAbc")
    Call<String> getBlog1(
            @Url String url,
            @Query("type") String name1,
            @Query("address") String address1
    );

}

這個是我們寫的案例,下面寫個測試用例

    private static void methodTest() {
        Method[] methods = ApiService1.class.getMethods();
        int index = 0;
        Method method = methods[index];
        Type[] parameterTypes = method.getGenericParameterTypes();
        for (int i = 0; i < parameterTypes.length; i++) {
            System.out.println("Type:   " + parameterTypes[i]);
        }
        Type returnType = method.getGenericReturnType();
        System.out.println("returnType:   " + returnType);
        System.out.println("**********************");
        Annotation[] methodAnnotations = method.getAnnotations();
        for (int i = 0; i < methodAnnotations.length; i++) {
            System.out.println("Annotation:   " + methodAnnotations[i]);
        }
        System.out.println("**********************");
        System.out.println();
        System.out.println();
        Annotation[][] parameterAnnotationsArray = method.getParameterAnnotations();
        for (int i = 0; i < parameterAnnotationsArray.length; i++) {
            Annotation[] ats = parameterAnnotationsArray[i];
            for (int j = 0; j < ats.length; j++) {
                System.out.println("j=   " + j +"    " + ats[j]);
            }
            System.out.println(" ****** ");
        }
    }

我們首先獲取 ApiService1 class對象中所有的方法,上面例子中只有一個,從數組中獲取出來;getGenericParameterTypes() 對應的形參的類型;getGenericReturnType() 獲取的是方法返回值的類型;getAnnotations()獲取的是註解;getParameterAnnotations()  獲取的是方法中形參的註解,運行一下,打印結果如下

Type:   class java.lang.String
Type:   class java.lang.String
Type:   class java.lang.String
returnType:   retrofit2.Call<java.lang.String>
**********************
Annotation:   @retrofit2.http.GET(value=testAbc)
**********************


j=   0    @retrofit2.http.Url()
 ****** 
j=   0    @retrofit2.http.Query(encoded=false, value=type)
 ****** 
j=   0    @retrofit2.http.Query(encoded=false, value=address)
 ****** 

註解的這些方法弄明白了,上面這個例子明白了,再看 Retrofit 就相對簡單了。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章