如何在改造中自定义请求参数注解

  介绍

这篇文章将为大家详细讲解有关如何在改造中自定义请求参数注解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<强>改造中使用方式

先来看看在改造中对于这两种请求的声明方式:

<强>得到请求

@ 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(),,真的);   }

我省略了大部分的代码,整段的代码其实就是来判断方法注解的类型,然后继续解析方法路径,我们仅关注后这一分支:

如何在改造中自定义请求参数注解