扔掉okhttp、httpClient,来试试这款轻量级HTTP客户端神器?
在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框架快速整合,并且支持了诸多功能增强,极大简化开发。
功能特性
自定义注入OkHttpClient
注解式拦截器
连接池管理
日志打印
请求重试
错误解码器
全局拦截器
熔断降级
微服务之间的HTTP调用
调用适配器
数据转换器
快速使用
引入依赖
com.github.lianjiatech
retrofit-spring-boot-starter
2.2.2
定义http接口
接口必须使用@RetrofitClient注解标记!http相关注解可参考官方文档:retrofit官方文档。搜索Java知音公众号,回复“后端面试”,送你一份Java面试题宝典.pdf
https://square.github.io/retrofit/
@RetrofitClient(baseUrl = “${test.baseUrl}”)
public interface HttpApi {
@GET("person")
Result<Person> getPerson(@Query("id") Long id);
}
注入使用
将接口注入到其它Service中即可使用!
@Service
public class TestService {
@Autowired
private HttpApi httpApi;
public void test() {
// 通过httpApi发起http请求
}
}
HTTP请求相关注解
HTTP请求相关注解,全部使用了retrofit原生注解。详细信息可参考官方文档,以下是一个简单说明。
扔掉okhttp、httpClient,来试试这款轻量级HTTP客户端神器?
配置项说明
retrofit-spring-boot-starter支持了多个可配置的属性,用来应对不同的业务场景。您可以视情况进行修改,具体说明如下:
扔掉okhttp、httpClient,来试试这款轻量级HTTP客户端神器?
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<Person> 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);
}