项目里使用的版本是 '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 就相对简单了。