EncodeLifeCycle.java 1.74 KB
package com.topdraw.dockingapi.config;

import com.alibaba.fastjson.JSON;
import com.dtflys.forest.http.ForestBody;
import com.dtflys.forest.http.ForestRequest;
import com.dtflys.forest.lifecycles.MethodAnnotationLifeCycle;
import com.dtflys.forest.reflection.ForestMethod;
import com.topdraw.dockingapi.entity.EncryptEntity;
import com.topdraw.dockingapi.util.DecryptUtils;
import lombok.SneakyThrows;

import java.lang.reflect.Parameter;

/**
 * @author wenxin
 * @version 1.0
 * @date 2024/5/28 下午2:46
 */
public class EncodeLifeCycle implements MethodAnnotationLifeCycle<Encode, Object> {


    /**
     * 当方法调用时调用此方法,此时还没有执行请求发送
     * 此方法可以获得请求对应的方法调用信息,以及动态传入的方法调用参数列表
     */
    @SneakyThrows
    @Override
    public void onInvokeMethod(ForestRequest request, ForestMethod method, Object[] args) {
        String value = (String) getAttribute(request, "value");
        Parameter[] parameters = method.getMethod().getParameters();
        for (int i = 0; i < parameters.length; i++) {
            EncodeBody annotation = parameters[i].getAnnotation(EncodeBody.class);
            if (annotation != null) {
                Object body = args[i];
                String jsonString = JSON.toJSONString(body);
                String encode = DecryptUtils.encode(value, jsonString);
                EncryptEntity encodeBody = new EncryptEntity(encode);
                ForestBody forestBody = request.getBody();
                //替换body
                forestBody.clear();
                request.addBody(encodeBody);
            }
        }
    }


    @Override
    public void onMethodInitialized(ForestMethod method, Encode annotation) {

    }
}