调用适配器和数据转码器
调用适配器
Retrofit可以通过调用适配器CallAdapterFactory将Call对象适配成接口方法的返回值类型。retrofit-spring-boot-starter扩展2种CallAdapterFactory实现:
BodyCallAdapterFactory
- 默认启用,可通过配置
retrofit.enable-body-call-adapter=false关闭 - 同步执行http请求,将响应体内容适配成接口方法的返回值类型实例。
- 除了
Retrofit.Call、Retrofit.Response、java.util.concurrent.CompletableFuture之外,其它返回类型都可以使用该适配器。
ResponseCallAdapterFactory
- 默认启用,可通过配置
retrofit.enable-response-call-adapter=false关闭 - 同步执行http请求,将响应体内容适配成
Retrofit.Response返回。 - 如果方法的返回值类型为
Retrofit.Response,则可以使用该适配器。
Retrofit自动根据方法返回值类型选用对应的CallAdapterFactory执行适配处理!加上Retrofit默认的CallAdapterFactory,可支持多种形式的方法返回值类型:
Call: 不执行适配处理,直接返回Call对象CompletableFuture: 将响应体内容适配成CompletableFuture对象返回Void: 不关注返回类型可以使用Void。如果http状态码不是2xx,直接抛错!Response: 将响应内容适配成Response对象返回- 其他任意Java类型:将响应体内容适配成一个对应的Java类型对象返回,如果http状态码不是2xx,直接抛错!
/** * Call<T> * 不执行适配处理,直接返回Call<T>对象 * @param id * @return */ @GET("person") Call<Result<Person>> getPersonCall(@Query("id") Long id); /** * CompletableFuture<T> * 将响应体内容适配成CompletableFuture<T>对象返回 * @param id * @return */ @GET("person") CompletableFuture<Result<Person>> getPersonCompletableFuture(@Query("id") Long id); /** * Void * 不关注返回类型可以使用Void。如果http状态码不是2xx,直接抛错! * @param id * @return */ @GET("person") Void getPersonVoid(@Query("id") Long id); /** * Response<T> * 将响应内容适配成Response<T>对象返回 * @param id * @return */ @GET("person") Response<Result<Person>> getPersonResponse(@Query("id") Long id); /** * 其他任意Java类型 * 将响应体内容适配成一个对应的Java类型对象返回,如果http状态码不是2xx,直接抛错! * @param id * @return */ @GET("person") Result<Person> getPerson(@Query("id") Long id); 复制代码
我们也可以通过继承CallAdapter.Factory扩展实现自己的CallAdapter!
retrofit-spring-boot-starter支持通过retrofit.global-call-adapter-factories配置全局调用适配器工厂,工厂实例优先从Spring容器获取,如果没有获取到,则反射创建。默认的全局调用适配器工厂是[BodyCallAdapterFactory, ResponseCallAdapterFactory]!
retrofit: # 全局调用适配器工厂 global-call-adapter-factories: - com.github.lianjiatech.retrofit.spring.boot.core.BodyCallAdapterFactory - com.github.lianjiatech.retrofit.spring.boot.core.ResponseCallAdapterFactory 复制代码
针对每个Java接口,还可以通过@RetrofitClient注解的callAdapterFactories()指定当前接口采用的CallAdapter.Factory,指定的工厂实例依然优先从Spring容器获取。
注意:如果CallAdapter.Factory没有public的无参构造器,请手动将其配置成Spring容器的Bean对象!
数据转码器
Retrofit使用Converter将@Body注解标注的对象转换成请求体,将响应体数据转换成一个Java对象,可以选用以下几种Converter:
- [Gson]
- [Jackson]
- [Moshi]
- [Protobuf]
- [Wire]
- [Simple XML]
- [JAXB]
retrofit-spring-boot-starter支持通过retrofit.global-converter-factories配置全局数据转换器工厂,转换器工厂实例优先从Spring容器获取,如果没有获取到,则反射创建。默认的全局数据转换器工厂是retrofit2.converter.jackson.JacksonConverterFactory,你可以直接通过spring.jackson.*配置jackson序列化规则,配置可参考[Customize the Jackson ObjectMapper]
retrofit: # 全局转换器工厂 global-converter-factories: - retrofit2.converter.jackson.JacksonConverterFactory 复制代码
针对每个Java接口,还可以通过@RetrofitClient注解的converterFactories()指定当前接口采用的Converter.Factory,指定的转换器工厂实例依然优先从Spring容器获取。
注意:如果Converter.Factory没有public的无参构造器,请手动将其配置成Spring容器的Bean对象!
总结
retrofit-spring-boot-starter一个适用于SpringBoot项目的轻量级HTTP客户端框架,已在线上稳定运行一年多,并且已经有多个外部公司也接入使用。有兴趣的朋友可以尝试一下