基于Forest实践|如何统一对请求响应进行日志处理

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

Forest 是一个开源的 Java HTTP 客户端框架,它能够将 HTTP 的所有请求信息(包括 URL、Header 以及 Body 等信息)绑定到您自定义的 Interface 方法上,能够通过调用本地接口方法的方式发送 HTTP 请求。

本文基于Forest实践,来源于实际业务场景需求,诞生了本篇文章,通过本篇你可以学习到如何更优雅的统一处理请求签名,相信你会有所收获!

1、背景介绍

我们之所以选择Forest,而不选择Spring RestTemplate,是因为Forest支持你通过定义一个接口,通过其相关增强注解,你就可以像在本地调用方法一样,实现调用HTTP请求方法。同时,它提供了一系列缺省配置参数,使得你可以很简单的配置,就可以以最小的研发代码量实现你的需求。

Forest实现原理跟MyBatisMapperProxy类似,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 {
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值