項目裏使用的版本是 '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 就相對簡單了。