EncodeLifeCycle.java 1.77 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> {

    private Integer bodyIndex;

    /**
     * 当方法调用时调用此方法,此时还没有执行请求发送
     * 此方法可以获得请求对应的方法调用信息,以及动态传入的方法调用参数列表
     */
    @SneakyThrows
    @Override
    public void onInvokeMethod(ForestRequest request, ForestMethod method, Object[] args) {
        String value = (String) getAttribute(request, "value");
        Object body = args[bodyIndex];
        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) {
        Parameter[] parameters = method.getMethod().getParameters();
        for (int i = 0; i < parameters.length; i++) {
            Parameter parameter = parameters[i];
            EncodeBody body = parameter.getAnnotation(EncodeBody.class);
            if (body != null) {
                bodyIndex = i;
            }
        }
    }
}