扔掉okhttp、httpClient,来试试这款轻量级HTTP客户端神器?

您所在的位置:网站首页 retrofit框架功能 扔掉okhttp、httpClient,来试试这款轻量级HTTP客户端神器?

扔掉okhttp、httpClient,来试试这款轻量级HTTP客户端神器?

#扔掉okhttp、httpClient,来试试这款轻量级HTTP客户端神器?| 来源: 网络整理| 查看: 265

点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

作者 | 伍陆七

来源 | https://juejin.cn/post/6898485806587969544

在SpringBoot项目直接使用okhttp、httpClient或者RestTemplate发起HTTP请求,既繁琐又不方便统一管理。因此,在这里推荐一个适用于SpringBoot项目的轻量级HTTP客户端框架retrofit-spring-boot-starter,使用非常简单方便,同时又提供诸多功能增强。目前项目已经更新至2.2.2版本,并且会持续进行迭代优化。

github项目地址:

https://github.com/LianjiaTech/retrofit-spring-boot-starter

gitee项目地址:

https://gitee.com/lianjiatech/retrofit-spring-boot-starter

前言

Retrofit是适用于Android和Java且类型安全的HTTP客户端,其最大的特性的是支持通过接口的方式发起HTTP请求。而spring-boot是使用最广泛的Java开发框架,但是Retrofit官方没有支持与spring-boot框架快速整合,因此我们开发了retrofit-spring-boot-starter。

retrofit-spring-boot-starter实现了Retrofit与spring-boot框架快速整合,并且支持了诸多功能增强,极大简化开发。

🚀项目持续优化迭代,欢迎大家提ISSUE和PR!麻烦大家能给一颗star✨,您的star是我们持续更新的动力!

功能特性自定义注入OkHttpClient注解式拦截器连接池管理日志打印请求重试错误解码器全局拦截器熔断降级微服务之间的HTTP调用调用适配器数据转换器快速使用引入依赖     com.github.lianjiatech     retrofit-spring-boot-starter     2.2.2 复制代码定义http接口

接口必须使用@RetrofitClient注解标记!http相关注解可参考官方文档:https://square.github.io/retrofit/。

@RetrofitClient(baseUrl = "${test.baseUrl}") public interface HttpApi {     @GET("person")     Result getPerson(@Query("id") Long id); } 复制代码注入使用

将接口注入到其它Service中即可使用!

@Service public class TestService {     @Autowired     private HttpApi httpApi;     public void test() {         // 通过httpApi发起http请求     } } 复制代码HTTP请求相关注解

HTTP请求相关注解,全部使用了retrofit原生注解。详细信息可参考官方文档:https://square.github.io/retrofit/,以下是一个简单说明。

注解分类

支持的注解

请求方式

@GET @HEAD @POST @PUT @DELETE @OPTIONS

请求头

@Header @HeaderMap @Headers

Query参数

@Query @QueryMap @QueryName

path参数

@Path

form-encoded参数

@Field @FieldMap @FormUrlEncoded

文件上传

@Multipart @Part @PartMap

url参数

@Url

配置项说明

retrofit-spring-boot-starter支持了多个可配置的属性,用来应对不同的业务场景。您可以视情况进行修改,具体说明如下:

配置

默认值

说明

enable-log

true

启用日志打印

logging-interceptor

DefaultLoggingInterceptor

日志打印拦截器

pool

连接池配置

disable-void-return-type

false

禁用java.lang.Void返回类型

retry-interceptor

DefaultRetryInterceptor

请求重试拦截器

global-converter-factories

JacksonConverterFactory

全局转换器工厂

global-call-adapter-factories

BodyCallAdapterFactory,ResponseCallAdapterFactory

全局调用适配器工厂

enable-degrade

false

是否启用熔断降级

degrade-type

sentinel

熔断降级实现方式(目前仅支持Sentinel)

resource-name-parser

DefaultResourceNameParser

熔断资源名称解析器,用于解析资源名称

yml配置方式:

retrofit:   enable-response-call-adapter: true   # 启用日志打印   enable-log: true   # 连接池配置   pool:     test1:       max-idle-connections: 3       keep-alive-second: 100     test2:       max-idle-connections: 5       keep-alive-second: 50   # 禁用void返回值类型   disable-void-return-type: false   # 日志打印拦截器   logging-interceptor: com.github.lianjiatech.retrofit.spring.boot.interceptor.DefaultLoggingInterceptor   # 请求重试拦截器   retry-interceptor: com.github.lianjiatech.retrofit.spring.boot.retry.DefaultRetryInterceptor   # 全局转换器工厂   global-converter-factories:     - retrofit2.converter.jackson.JacksonConverterFactory   # 全局调用适配器工厂   global-call-adapter-factories:     - com.github.lianjiatech.retrofit.spring.boot.core.BodyCallAdapterFactory     - com.github.lianjiatech.retrofit.spring.boot.core.ResponseCallAdapterFactory   # 是否启用熔断降级   enable-degrade: true   # 熔断降级实现方式   degrade-type: sentinel   # 熔断资源名称解析器   resource-name-parser: com.github.lianjiatech.retrofit.spring.boot.degrade.DefaultResourceNameParser 复制代码高级功能自定义注入OkHttpClient

通常情况下,通过@RetrofitClient注解属性动态创建OkHttpClient对象能够满足大部分使用场景。但是在某些情况下,用户可能需要自定义OkHttpClient,这个时候,可以在接口上定义返回类型是OkHttpClient.Builder的静态方法来实现。代码示例如下:

@RetrofitClient(baseUrl = "http://ke.com") public interface HttpApi3 {     @OkHttpClientBuilder     static OkHttpClient.Builder okhttpClientBuilder() {         return new OkHttpClient.Builder()                 .connectTimeout(1, TimeUnit.SECONDS)                 .readTimeout(1, TimeUnit.SECONDS)                 .writeTimeout(1, TimeUnit.SECONDS);     }     @GET     Result getPerson(@Url String url, @Query("id") Long id); } 复制代码

方法必须使用@OkHttpClientBuilder注解标记!

注解式拦截器

很多时候,我们希望某个接口下的某些http请求执行统一的拦截处理逻辑。为了支持这个功能,retrofit-spring-boot-starter提供了注解式拦截器,做到了基于url路径的匹配拦截。使用的步骤主要分为2步:

继承BasePathMatchInterceptor编写拦截处理器;接口上使用@Intercept进行标注。如需配置多个拦截器,在接口上标注多个@Intercept注解即可!

下面以给指定请求的url后面拼接timestamp时间戳为例,介绍下如何使用注解式拦截器。

继承BasePathMatchInterceptor编写拦截处理器@Component public class TimeStampInterceptor extends BasePathMatchInterceptor {     @Override     public Response doIntercept(Chain chain) throws IOException {         Request request = chain.request();         HttpUrl url = request.url();         long timestamp = System.currentTimeMillis();         HttpUrl newUrl = url.newBuilder()                 .addQueryParameter("timestamp", String.valueOf(timestamp))                 .build();         Request newRequest = request.newBuilder()                 .url(newUrl)                 .build();         return chain.proceed(newRequest);     } } 复制代码接口上使用@Intercept进行标注@RetrofitClient(baseUrl = "${test.baseUrl}") @Intercept(handler = TimeStampInterceptor.class, include = {"/api/**"}, exclude = "/api/test/savePerson") public interface HttpApi {     @GET("person")     Result getPerson(@Query("id") Long id);     @POST("savePerson")     Result savePerson(@Body Person person); } 复制代码

上面的@Intercept配置表示:拦截HttpApi接口下/api/**路径下(排除/api/test/savePerson)的请求,拦截处理器使用TimeStampInterceptor。

扩展注解式拦截器

有的时候,我们需要在拦截注解动态传入一些参数,然后再执行拦截的时候需要使用这个参数。这种时候,我们可以扩展实现自定义拦截注解。自定义拦截注解必须使用@InterceptMark标记,并且注解中必须包括include()、exclude()、handler()属性信息。使用的步骤主要分为3步:

自定义拦截注解继承BasePathMatchInterceptor编写拦截处理器接口上使用自定义拦截注解;

例如我们需要在请求头里面动态加入accessKeyId、accessKeySecret签名信息才能正常发起http请求,这个时候可以自定义一个加签拦截器注解@Sign来实现。下面以自定义@Sign拦截注解为例进行说明。

自定义@Sign注解@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @InterceptMark public @interface Sign {     /**      * 密钥key      * 支持占位符形式配置。      *      * @return      */     String accessKeyId();     /**      * 密钥      * 支持占位符形式配置。      *      * @return      */     String accessKeySecret();     /**      * 拦截器匹配路径      *      * @return      */     String[] include() default {"/**"};     /**      * 拦截器排除匹配,排除指定路径拦截      *      * @return      */     String[] exclude() default {};     /**      * 处理该注解的拦截器类      * 优先从spring容器获取对应的Bean,如果获取不到,则使用反射创建一个!      *      * @return      */     Class


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3