基于RestTemplate+aop实现HTTP远程调用

第一步:定义注解
用于aop方法执行时拦截并定义相关信息
20240504新增修改,添加了service方法和file方法

import org.springframework.http.HttpMethod;

import java.lang.annotation.*;

/**
 * 远程调用注解
 *
 * @author zhu.zn 2024/4/30 18:13
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RemoteCall {
   
    /**
     * 用于拿到yml配置的url和和header配置
     * @return 相关服务的key
     */
    String service();
    /**
     * 请求路径
     * @return 请求接口的路径
     */
    String path();

    /**
     * 请求方式
     * @return 请求的Http方式
     */
    HttpMethod method() default HttpMethod.GET;

    /**
     * 请求头
     * @return 额外请求头设置
     */
    String[] headers() default {
   };

    /**
     * GET请求
     * 查询参数字段名称
     * @return 查询参数字段名称
     */
    String[] params() default {
   };

    /**
     * POST请求
     * 请求体
     * @return 请求体
     */
    String body() default "";

    /**
     * path模板的参数名称
     * @return 参数名称
     */
    String[] variable() default {
   };

    /**
     * 文件参数名称必须为文件路径
     * @return 文件
     */
    String file() default "";
}

yml配置项

neil:
  rest:
    service:
      test:
        url: http://localhost:8080
        headers:
          appid: test
          secret: 123456

读取相关service配置方法

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import java.util.Map;

@Data
@Configuration
@ConfigurationProperties(prefix = "neil.rest")
public class RestTemplateConfig {
   

    private Map<String, ServiceConfig> service;

    @Data
    public static class ServiceConfig {
   
        private String url;
        private Map<String, String> headers;
    }

    public ServiceConfig getServiceConfig(String serviceName) {
   
        return service.get(serviceName);
    }

   @Bean
   public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
   
       return new RestTemplate(factory);
   }

   @Bean
   public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
   
       SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
       //ms毫秒
       factory.setReadTimeout(5000);
       //ms毫秒
       factory.setConnectTimeout(15000);
       return factory;
   }

第二步:定义Aspect
2024004新增service和文件上传支持

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.neil.common.aspect.annotation.RemoteCall;
import org.neil.common.resource.MyInputStreamResource;
import org.neil.config.RestTemplateConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.io.FileSystemResource;
import org
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值