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 就相对简单了。


 

发布了176 篇原创文章 · 获赞 11 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Deaht_Huimie/article/details/102942592