Forest是一个开源的 Java HTTP 客户端框架,它能够将 HTTP 的所有请求信息(包括 URL、Header 以及 Body 等信息)绑定到您自定义的 Interface 方法上,能够通过调用本地接口方法的方式发送 HTTP 请求。本文基于Forest实践,来源于实际业务场景需求,诞生了本篇文章,通过本篇你可以学习到如何更优雅的统一处理请求签名,相信你会有所收获!
1、背景介绍
我们之所以选择Forest,而不选择Spring RestTemplate,是因为Forest支持你通过定义一个接口,通过其相关增强注解,你就可以像在本地调用方法一样,实现调用HTTP请求方法。同时,它提供了一系列缺省配置参数,使得你可以很简单的配置,就可以以最小的研发代码量实现你的需求。
Forest实现原理跟MyBatis 的MapperProxy类似,Spring容器初始化时,通过扫描包下使用了@BaseRequest的相关接口,通过动态代理生成Http访问类。
当我们程序调用接口方法时,就是从Forest上下文对象中获取预先初始化的代理类,然后委托OkHttp3或者HttpClient实现http调用,只不过Forest优雅的封装了这一系列背后工作,使得我们的代码更精简,更优雅,所以它也是一个非常轻量级的Http工具。
本文介绍,就是当我们业务场景中定义了大量的client接口,但是这些提供接口的三方API都需要我们在请求header增加签名,这时候我们具体应该怎么做呢?
2、实现思路
2.1、基于@Header增强
代码样例
/**
* @description: 抵押客户公众号服务端
* @Date : 2021/9/7 3:37 PM
* @Author : 石冬冬-Seig Heil
*/
@BaseRequest(
baseURL = "${domain.car_mortgage_customer}",
interceptor = {
CarMortgageCustomerInterceptor.class,SimpleForestInterceptor.class}
)
public interface CarMortgageCustomerApi {
/**
* 推送公众号模板消息
* 当前消息模板在<car-mortgage-customer>应用中,基于xdiamond配置。
* 对于抵押网络只需要双方拟定好模板中的变量即可。
* @param dto
* @return
*/
@PostRequest("/mortgage/mortgageNotice")
@TraceMarker(appCode = "${$1.mortgageCode}",traceType = TraceTypeEnum.CAR_MORTGAGE_CUSTOMER_INVOKE)
RespDTO<String> notice(@Header("sign") String sign, @JSONBody MortgageNoticeDTO dto);
}
如上图,我们通过对方法参数通过@Header增强,然后设置注解的sign,这时候程序调用的时候,就会吧sign的值设置为请求header中的sign。
方案总结
我们从上述代码样例中发现,倘若Client提供的方法非常多,我们需要每个成员方法都需要增加一个参数String sign,这意味着所有涉及调用该方法的时候,需要给sign参数赋值,如果有一天三方接口邀请请求header再增加其他参数时,我们就会把涉及到所有的调用地方都得做变动,这样以来难免波及范围大,不符合”开闭原则“。
2.2、基于Proxy委托代理
其实我们可以思考一下,是否可以改善上述方案面临的缺陷,其实我们可以增加一个代理类,这样对于调用Client的地方,统一委托给代理类,通过代理类进而做相关增强处理,后续需要变动的话,在代理类修改相应业务逻辑即可。
代码样例
/**
* @description: 抵押客户公众号服务端
* @Date : 2021/9/7 3:41 PM
* @Author : 石冬冬-Seig Heil
*/
@Component
public class CarMortgageCustomerApiProxy {

本文介绍了在使用Forest Java HTTP客户端框架时,如何优雅地处理请求签名。通过@Header增强、Proxy委托代理和Interceptor拦截器三种方案,详细阐述了各自优缺点。最终推荐使用Interceptor,通过自定义注解和拦截器统一处理签名,以符合‘开闭原则’。
最低0.47元/天 解锁文章
4720

被折叠的 条评论
为什么被折叠?



