这篇文章将为大家详细讲解有关如何在改造中自定义请求参数注解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强>改造中使用方式强>
先来看看在改造中对于这两种请求的声明方式:
<强>得到请求强>
@ GET(“运输/info") Flowable我们使用@Query注解来声明查询参数,每一个参数都需要用@Query注解标记
<强>文章请求
强>@POST(“运输/update") Flowable, params); 在帖子请求中,我们通过@Body注解来标记需要传递给服务器的对象
<强>文章请求参数的声明能否更直观强>
以上两种常规的请求方式很普通,没有什么特别要说明的。
有次团队讨论一个问题,我们所有的请求都是声明在不同的接口中的,如官方示例:
public interface GitHubService { ,@ get(“用户/{user}/repos") ,Call
如果是得到请求还好,通过@Query注解我们可以直观的看到请求的参数,但如果是帖子请求的话,我们只能够在上层调用的地方才能看到具体的参数,那么的帖子请求的参数声明能否像得到请求一样直观呢?
<强> @Field注解强>
先看代码,关于@Field注解的使用:
@FormUrlEncoded @POST(“用户/edit") Call使用了@Field注解之后,我们将以表单的形式提交数据(first_name=XXX和;last_name=多)。
<>强基于约定带来的问题强>
看上去@Field注解可以满足我们的需求了,但遗憾的是之前我们和API约定了后请求数据传输的格式为JSON格式,显然我们没有办法使用该注解了
<强>改造参数注解的处理流程强>
这个时候我想是不是可以模仿@Field注解,自己实现一个注解最后使得参数以JSON的格式传递给API就好了,在此之前我们先来看看改造中对于请求的参数是如何处理的:
<强> ServiceMethod中建设者的构造函数强>
Builder (Retrofit 改造,Method 方法),{=,this.retrofit 改造;=,this.method 方法;=,,this.methodAnnotations  method.getAnnotations ();=,,this.parameterTypes  method.getGenericParameterTypes ();=,,this.parameterAnnotationsArray  method.getParameterAnnotations (); }我们关注三个属性:
<李>
methodAnnotations方法上的注解,注释[]类型
李> <李>parameterTypes参数类型,类型[]类型
李> <李>parameterAnnotationsArray参数注解,注释[][]类型
李>在构造函数中,我们主要对这5个属性赋值。
<强> Builder构造者的制造方法强>
接着我们看看在通过建造方法创建一个ServiceMethod对象的过程中发生了什么:
//省略了部分代码…… public ServiceMethod 建立(),{ ,//1只解析方法上的注解 ,for (Annotation Annotation : methodAnnotations), { ,parseMethodAnnotation(注释); ,} ,int parameterCount =, parameterAnnotationsArray.length;=,,parameterHandlers  new ParameterHandler<?祝辞(parameterCount); ,for (int p =, 0;, p & lt;, parameterCount;, p + +), { ,Type parameterType =, parameterTypes [p]; ,注释[]parameterAnnotations =, parameterAnnotationsArray [p]; ,//2只通过循环为每一个参数创建一个参数处理器 ,parameterHandlers [p],=, parseParameter (p, parameterType,, parameterAnnotations); ,} ,,return new  ServiceMethod<的在(这个); }解析方法上的注解parseMethodAnnotation
if (annotation instanceof 得到),{ ,parseHttpMethodAndPath (“GET",,((得到),注释)value(),,假); }else if (annotation instanceof  POST), { ,parseHttpMethodAndPath (“POST",, ((POST),注释)value(),,真的); }我省略了大部分的代码,整段的代码其实就是来判断方法注解的类型,然后继续解析方法路径,我们仅关注后这一分支:
如何在改造中自定义请求参数注解