diff --git a/core/pom.xml b/core/pom.xml index 2b0f27d..cbcc3c1 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -62,6 +62,10 @@ spring-boot-starter-test test + + org.springframework + spring-web + diff --git a/core/src/main/java/com/szy/core/eunm/SzyExceptionEnum.java b/core/src/main/java/com/szy/core/eunm/SzyExceptionEnum.java index 1ad68e6..df72a1b 100644 --- a/core/src/main/java/com/szy/core/eunm/SzyExceptionEnum.java +++ b/core/src/main/java/com/szy/core/eunm/SzyExceptionEnum.java @@ -5,8 +5,12 @@ public enum SzyExceptionEnum { CONFIG_CENTER_METHOD_SIGNATURE_ERROR(100001, "方法签名错误,方法必须无参并且有返回值"), + CONFIG_CENTER_ANNOTATION_NOT_FOUND(100002, "接口上使用@SConfigCenter, 返回值为基础类型的方法必须使用@SValue注解"), + HTTP_CENTER_HTTPMETHOD_NOT_FOUND(200001, "请求方式必须设置"), + + HTTP_CENTER_HTTPSUBPATH_NOT_FOUND(200002, "请求子路径必须设置") ; diff --git a/core/src/main/java/com/szy/core/httpcenter/HttpCenterFactory.java b/core/src/main/java/com/szy/core/httpcenter/HttpCenterFactory.java new file mode 100644 index 0000000..21154eb --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/HttpCenterFactory.java @@ -0,0 +1,143 @@ +package com.szy.core.httpcenter; + +import com.szy.core.eunm.SzyExceptionEnum; +import com.szy.core.httpcenter.annotation.*; +import com.szy.core.util.GenericBuilder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.cglib.proxy.CallbackHelper; +import org.springframework.cglib.proxy.Enhancer; +import org.springframework.cglib.proxy.InvocationHandler; +import org.springframework.cglib.proxy.NoOp; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.text.MessageFormat; +import java.util.HashMap; +import java.util.Map; + +@Component +@Slf4j +public class HttpCenterFactory implements FactoryBean { + + private Class interfaceType; + + @Resource + SzyHttpClientFactory szyHttpClientFactory; + + SzyHttpClient szyHttpClient; + private final InvocationHandler invocationHandler = (o, method1, objects) -> { + + SzyExceptionEnum.HTTP_CENTER_HTTPSUBPATH_NOT_FOUND + .throwsIf(!method1.isAnnotationPresent(SHttpSubPath.class)); + + SzyExceptionEnum.HTTP_CENTER_HTTPMETHOD_NOT_FOUND + .throwsIf(!method1.isAnnotationPresent(SHttpMethod.class)); + + szyHttpClient = szyHttpClientFactory.getClient(); + + String url = method1.getAnnotation(SHttpSubPath.class).value(); + + Annotation[][] parameterAnnotations = method1.getParameterAnnotations(); + + String[] pathVars = new String[parameterAnnotations.length]; + int pathVarIndex = 0; + for(int i = 0; i < parameterAnnotations.length; i ++){ + if(parameterAnnotations[i][0].annotationType() == SPathVar.class){ + pathVars[pathVarIndex ++] = objects[i].toString(); + } + + } + if(pathVarIndex > 0){ + url = MessageFormat.format(url, pathVars); + } + + String httpMethod = method1.getAnnotation(SHttpMethod.class).value(); + szyHttpClient.setHttpMethod(httpMethod); + + if(interfaceType.isAnnotationPresent(SHttpPath.class)){ + url = interfaceType.getAnnotation(SHttpPath.class).value() + url; + } + + + if (method1.isAnnotationPresent(SHttpHeaders.class)) { + SHttpHeader[] annotationsByType = method1.getAnnotationsByType(SHttpHeader.class); + log.info("annotationsByType:" + annotationsByType); + for (SHttpHeader annotation : annotationsByType) { + szyHttpClient.setHeader(annotation.key(), annotation.value()); + } + } + + HashMap requestParammap = new HashMap<>(); + for(int i = 0; i < parameterAnnotations.length; i ++){ + if(parameterAnnotations[i][0] instanceof SRequestParam){ + requestParammap.put(((SRequestParam) parameterAnnotations[i][0]).value(), objects[i]); + } + } + if(requestParammap.size() > 0){ + url = url + "?"; + for(Map.Entry entry : requestParammap.entrySet()){ + url = url + entry.getKey() + "=" + entry.getValue() + "&"; + } + } + szyHttpClient.setUrl(url); + + + int bodyIndex = -1; + for(int i = 0; i < parameterAnnotations.length; i ++){ + if(parameterAnnotations[i][0].annotationType() == SHttpBody.class){ + bodyIndex = i; + } + } + if(bodyIndex != -1){ + szyHttpClient.setBody(objects[bodyIndex]); + } + + Type type = method1.getGenericReturnType(); + + return szyHttpClient.excute(type); + + }; + + /** + * 由 beanDefinition 注入 + */ + public HttpCenterFactory(Class interfaceType) { + this.interfaceType = interfaceType; + } + + @Override + public T getObject() { + CallbackHelper callbackHelper = new CallbackHelper(Object.class, new Class[]{interfaceType}) { + @Override + protected Object getCallback(Method method) { + return method.isDefault() + ? NoOp.INSTANCE + : invocationHandler; + } + }; + + Enhancer enhancer = GenericBuilder.of(Enhancer::new) + .with(Enhancer::setSuperclass, Object.class) + .with(Enhancer::setInterfaces, new Class[] {interfaceType}) + .with(Enhancer::setCallbackFilter, callbackHelper) + .with(Enhancer::setCallbackTypes, callbackHelper.getCallbackTypes()) + .with(Enhancer::setCallbacks, callbackHelper.getCallbacks()) + .build(); + + return (T) enhancer.create(); + } + + @Override + public Class getObjectType() { + return interfaceType; + } + + @Override + public boolean isSingleton() { + return true; + } +} diff --git a/core/src/main/java/com/szy/core/httpcenter/HttpCenterProcessor.java b/core/src/main/java/com/szy/core/httpcenter/HttpCenterProcessor.java new file mode 100644 index 0000000..c54adca --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/HttpCenterProcessor.java @@ -0,0 +1,109 @@ +package com.szy.core.httpcenter; + +import com.szy.core.httpcenter.annotation.HttpCenterScan; +import com.szy.core.httpcenter.annotation.SHttpCenter; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.GenericBeanDefinition; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.ResourceLoaderAware; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.core.env.Environment; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternUtils; +import org.springframework.core.type.AnnotationMetadata; +import org.springframework.core.type.classreading.CachingMetadataReaderFactory; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; + +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.util.LinkedHashSet; +import java.util.Set; + +@Component +@Slf4j +public class HttpCenterProcessor implements + ImportBeanDefinitionRegistrar, + ResourceLoaderAware, + EnvironmentAware { + + private static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; + + private MetadataReaderFactory metadataReaderFactory; + + private ResourcePatternResolver resourcePatternResolver; + + private Environment environment; + + @SneakyThrows + @Override + public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { + ImportBeanDefinitionRegistrar.super.registerBeanDefinitions(importingClassMetadata, registry); + AnnotationAttributes httpScanAttr = AnnotationAttributes.fromMap( + importingClassMetadata.getAnnotationAttributes(HttpCenterScan.class.getName())); + String basePackageName = httpScanAttr.getString("value"); + Set> beanClazzs = scannerPackages(basePackageName); + for (Class beanClazz : beanClazzs) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(beanClazz); + GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition(); + + definition.getConstructorArgumentValues().addGenericArgumentValue(beanClazz); + definition.setBeanClass(HttpCenterFactory.class); + + //这里采用的是byType方式注入,类似的还有byName等 + definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE); + registry.registerBeanDefinition(beanClazz.getSimpleName(), definition); + } + } + + /** + * 根据包路径获取包及子包下的所有类 + * + * @param basePackage basePackage + */ + private Set> scannerPackages(String basePackage) throws ClassNotFoundException, IOException { + Set> set = new LinkedHashSet<>(); + String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + + resolveBasePackage(basePackage) + '/' + DEFAULT_RESOURCE_PATTERN; + Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath); + for (Resource resource : resources) { + if (!resource.isReadable()) { + continue; + } + MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource); + String className = metadataReader.getClassMetadata().getClassName(); + Class clazz; + clazz = Class.forName(className); + Annotation annotation = clazz.getAnnotation(SHttpCenter.class); + if (annotation == null) { + continue; + } + set.add(clazz); + } + return set; + } + + protected String resolveBasePackage(String basePackage) { + return ClassUtils.convertClassNameToResourcePath(this.environment.resolveRequiredPlaceholders(basePackage)); + } + + @Override + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourcePatternResolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader); + this.metadataReaderFactory = new CachingMetadataReaderFactory(resourceLoader); + } + + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } +} diff --git a/core/src/main/java/com/szy/core/httpcenter/SzyHttpClient.java b/core/src/main/java/com/szy/core/httpcenter/SzyHttpClient.java new file mode 100644 index 0000000..bd014bd --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/SzyHttpClient.java @@ -0,0 +1,21 @@ +package com.szy.core.httpcenter; + +import org.springframework.stereotype.Component; + +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; + + +/** + * @author zzsnowy + */ +@Component +public interface SzyHttpClient { + + SzyHttpClient setUrl(String url); + SzyHttpClient setHttpMethod(String methodName); + SzyHttpClient setHeader(String key, String value); + SzyHttpClient setBody(T t); + R excute(Type type); +} diff --git a/core/src/main/java/com/szy/core/httpcenter/SzyHttpClientFactory.java b/core/src/main/java/com/szy/core/httpcenter/SzyHttpClientFactory.java new file mode 100644 index 0000000..151f1c9 --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/SzyHttpClientFactory.java @@ -0,0 +1,14 @@ +package com.szy.core.httpcenter; + + +import org.springframework.stereotype.Component; + +/** + * @author zzsnowy + */ +@Component +public interface SzyHttpClientFactory { + + SzyHttpClient getClient(); + +} diff --git a/core/src/main/java/com/szy/core/httpcenter/SzyHttpMethod.java b/core/src/main/java/com/szy/core/httpcenter/SzyHttpMethod.java new file mode 100644 index 0000000..7599baa --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/SzyHttpMethod.java @@ -0,0 +1,12 @@ +package com.szy.core.httpcenter; + +public interface SzyHttpMethod { + String POST = "POST"; + String GET = "GET"; + String HEAD = "HEAD"; + String PUT = "PUT"; + String PATCH = "PATCH"; + String DELETE = "DELETE"; + String OPTIONS = "OPTIONS"; + String TRACE = "TRACE"; +} diff --git a/core/src/main/java/com/szy/core/httpcenter/annotation/HttpCenterScan.java b/core/src/main/java/com/szy/core/httpcenter/annotation/HttpCenterScan.java new file mode 100644 index 0000000..cba3a08 --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/annotation/HttpCenterScan.java @@ -0,0 +1,15 @@ +package com.szy.core.httpcenter.annotation; + +import com.szy.core.httpcenter.HttpCenterProcessor; +import com.szy.core.httpcenter.impl.DefaultSzyHttpClientFactory; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Import({HttpCenterProcessor.class, DefaultSzyHttpClientFactory.class}) +public @interface HttpCenterScan { + String value(); +} diff --git a/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpBody.java b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpBody.java new file mode 100644 index 0000000..22d8ae6 --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpBody.java @@ -0,0 +1,9 @@ +package com.szy.core.httpcenter.annotation; + +import java.lang.annotation.*; + +@Target({ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SHttpBody { +} diff --git a/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpCenter.java b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpCenter.java new file mode 100644 index 0000000..8f056c2 --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpCenter.java @@ -0,0 +1,9 @@ +package com.szy.core.httpcenter.annotation; + +import java.lang.annotation.*; + +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SHttpCenter { +} diff --git a/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpHeader.java b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpHeader.java new file mode 100644 index 0000000..30e24cf --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpHeader.java @@ -0,0 +1,12 @@ +package com.szy.core.httpcenter.annotation; + +import java.lang.annotation.*; + +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Repeatable(SHttpHeaders.class) +public @interface SHttpHeader { + String key(); + String value(); +} diff --git a/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpHeaders.java b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpHeaders.java new file mode 100644 index 0000000..da9165e --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpHeaders.java @@ -0,0 +1,10 @@ +package com.szy.core.httpcenter.annotation; + +import java.lang.annotation.*; + +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SHttpHeaders { + SHttpHeader[] value(); +} diff --git a/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpMethod.java b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpMethod.java new file mode 100644 index 0000000..5f9cf34 --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpMethod.java @@ -0,0 +1,10 @@ +package com.szy.core.httpcenter.annotation; + +import java.lang.annotation.*; + +@Target({ ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SHttpMethod { + String value(); +} diff --git a/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpPath.java b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpPath.java new file mode 100644 index 0000000..ee3a91e --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpPath.java @@ -0,0 +1,10 @@ +package com.szy.core.httpcenter.annotation; + +import java.lang.annotation.*; + +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SHttpPath { + String value(); +} diff --git a/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpSubPath.java b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpSubPath.java new file mode 100644 index 0000000..96a975a --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/annotation/SHttpSubPath.java @@ -0,0 +1,10 @@ +package com.szy.core.httpcenter.annotation; + +import java.lang.annotation.*; + +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SHttpSubPath { + String value(); +} diff --git a/core/src/main/java/com/szy/core/httpcenter/annotation/SPathVar.java b/core/src/main/java/com/szy/core/httpcenter/annotation/SPathVar.java new file mode 100644 index 0000000..bcc9697 --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/annotation/SPathVar.java @@ -0,0 +1,10 @@ +package com.szy.core.httpcenter.annotation; + +import java.lang.annotation.*; + +@Target({ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SPathVar { + String value(); +} diff --git a/core/src/main/java/com/szy/core/httpcenter/annotation/SRequestParam.java b/core/src/main/java/com/szy/core/httpcenter/annotation/SRequestParam.java new file mode 100644 index 0000000..464d3c5 --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/annotation/SRequestParam.java @@ -0,0 +1,10 @@ +package com.szy.core.httpcenter.annotation; + +import java.lang.annotation.*; + +@Target({ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SRequestParam { + String value(); +} diff --git a/core/src/main/java/com/szy/core/httpcenter/impl/DefaultSzyHttpClient.java b/core/src/main/java/com/szy/core/httpcenter/impl/DefaultSzyHttpClient.java new file mode 100644 index 0000000..da508e1 --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/impl/DefaultSzyHttpClient.java @@ -0,0 +1,85 @@ +package com.szy.core.httpcenter.impl; + +import com.szy.core.httpcenter.SzyHttpClient; +import com.szy.core.httpcenter.SzyHttpMethod; +import com.szy.core.util.Matcher; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RequestCallback; +import org.springframework.web.client.ResponseExtractor; +import org.springframework.web.client.RestTemplate; + +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; + + +/** + * @author zzsnowy + */ +@Component +@Slf4j +public class DefaultSzyHttpClient implements SzyHttpClient { + + RestTemplate restTemplate; + String url; + HttpMethod httpMethod; + HttpHeaders headers; + + Map requestParams; + HttpEntity request; + + public DefaultSzyHttpClient(){ + restTemplate = new RestTemplate(); + headers = new HttpHeaders(); + } + @Override + public SzyHttpClient setUrl(String url) { + this.url = url; + return this; + } + + Matcher METHOD_MATCHER = Matcher.of( + SzyHttpMethod.POST, HttpMethod.POST, + SzyHttpMethod.GET, HttpMethod.GET, + SzyHttpMethod.DELETE, HttpMethod.DELETE, + SzyHttpMethod.HEAD, HttpMethod.HEAD, + SzyHttpMethod.PUT, HttpMethod.PUT, + SzyHttpMethod.PATCH, HttpMethod.PATCH, + SzyHttpMethod.OPTIONS, HttpMethod.OPTIONS, + SzyHttpMethod.TRACE, HttpMethod.TRACE + ); + + @Override + public SzyHttpClient setHttpMethod(String methodName) { + this.httpMethod = METHOD_MATCHER.match(methodName); + return this; + } + + @Override + public SzyHttpClient setHeader(String key, String value) { + headers.add(key, value); + return this; + } + + @Override + public SzyHttpClient setBody(Object o) { + request = new HttpEntity<>(o, headers); + return this; + } + + @Override + @SuppressWarnings({"unchecked"}) + public R excute(Type type) { + log.info("URL:" + url); + log.info("request:" + request); + RequestCallback requestCallback = restTemplate.httpEntityCallback(request, type); + ResponseExtractor> responseExtractor = restTemplate.responseEntityExtractor(type); + return (R) ((ResponseEntity)restTemplate.execute(url, httpMethod, requestCallback, responseExtractor)).getBody(); + } + +} diff --git a/core/src/main/java/com/szy/core/httpcenter/impl/DefaultSzyHttpClientFactory.java b/core/src/main/java/com/szy/core/httpcenter/impl/DefaultSzyHttpClientFactory.java new file mode 100644 index 0000000..cafb4db --- /dev/null +++ b/core/src/main/java/com/szy/core/httpcenter/impl/DefaultSzyHttpClientFactory.java @@ -0,0 +1,17 @@ +package com.szy.core.httpcenter.impl; + +import com.szy.core.httpcenter.SzyHttpClient; +import com.szy.core.httpcenter.SzyHttpClientFactory; +import org.springframework.stereotype.Component; + +/** + * @author zzsnowy + */ +@Component +public class DefaultSzyHttpClientFactory implements SzyHttpClientFactory { + + @Override + public SzyHttpClient getClient() { + return new DefaultSzyHttpClient(); + } +} diff --git a/demo/src/main/java/com/szy/demo/DemoApplication.java b/demo/src/main/java/com/szy/demo/DemoApplication.java index ba4cf03..622d3eb 100644 --- a/demo/src/main/java/com/szy/demo/DemoApplication.java +++ b/demo/src/main/java/com/szy/demo/DemoApplication.java @@ -1,13 +1,14 @@ package com.szy.demo; import com.szy.core.configcenter.ConfigCenterScan; +import com.szy.core.httpcenter.annotation.HttpCenterScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -@ConfigCenterScan("com") +@ConfigCenterScan("com.szy.demo.configcenter") +@HttpCenterScan("com.szy.demo.httpcenter") public class DemoApplication { - public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } diff --git a/demo/src/main/java/com/szy/demo/configcenter/LocalFileConfig.java b/demo/src/main/java/com/szy/demo/configcenter/LocalFileConfig.java index f0a2c8a..c9803cb 100644 --- a/demo/src/main/java/com/szy/demo/configcenter/LocalFileConfig.java +++ b/demo/src/main/java/com/szy/demo/configcenter/LocalFileConfig.java @@ -3,7 +3,6 @@ import com.szy.core.configcenter.annotation.SConfigCenter; import com.szy.core.configcenter.annotation.SValue; import com.szy.demo.configcenter.dto.SUserConfig; - @SConfigCenter public interface LocalFileConfig { diff --git a/demo/src/main/java/com/szy/demo/controller/HttpController.java b/demo/src/main/java/com/szy/demo/controller/HttpController.java new file mode 100644 index 0000000..b456d11 --- /dev/null +++ b/demo/src/main/java/com/szy/demo/controller/HttpController.java @@ -0,0 +1,13 @@ +package com.szy.demo.controller; + +import com.szy.demo.controller.vo.response.CommonResponse; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@RequestMapping("/req") +public interface HttpController { + + @GetMapping("/test") + public CommonResponse postRequest(); +} diff --git a/demo/src/main/java/com/szy/demo/controller/impl/HttpControllerImpl.java b/demo/src/main/java/com/szy/demo/controller/impl/HttpControllerImpl.java new file mode 100644 index 0000000..267003b --- /dev/null +++ b/demo/src/main/java/com/szy/demo/controller/impl/HttpControllerImpl.java @@ -0,0 +1,33 @@ +package com.szy.demo.controller.impl; + +import com.szy.core.httpcenter.SzyHttpClientFactory; +import com.szy.core.util.GenericBuilder; +import com.szy.demo.controller.HttpController; +import com.szy.demo.controller.vo.request.HttpTestRequest; +import com.szy.demo.controller.vo.response.CommonResponse; +import com.szy.demo.httpcenter.HttpRequest; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@RestController +public class HttpControllerImpl implements HttpController { + + @Resource + HttpRequest httpRequest; + + + @Override + public CommonResponse postRequest() { + + HttpTestRequest body = GenericBuilder.of(HttpTestRequest::new) + .with(HttpTestRequest::setMessage, "szy yyds") + .with(HttpTestRequest::setUsername, "zx") + .with(HttpTestRequest::setPassword, "zxpw") + .build() + ; + + return httpRequest.httpPostRequest(1, "a", "z", body); + } +} diff --git a/demo/src/main/java/com/szy/demo/controller/vo/request/HttpTestRequest.java b/demo/src/main/java/com/szy/demo/controller/vo/request/HttpTestRequest.java new file mode 100644 index 0000000..94d0841 --- /dev/null +++ b/demo/src/main/java/com/szy/demo/controller/vo/request/HttpTestRequest.java @@ -0,0 +1,10 @@ +package com.szy.demo.controller.vo.request; + +import lombok.Data; + +@Data +public class HttpTestRequest { + private String message; + private String username; + private String password; +} diff --git a/demo/src/main/java/com/szy/demo/controller/vo/response/CommonResponse.java b/demo/src/main/java/com/szy/demo/controller/vo/response/CommonResponse.java new file mode 100644 index 0000000..f2e6505 --- /dev/null +++ b/demo/src/main/java/com/szy/demo/controller/vo/response/CommonResponse.java @@ -0,0 +1,24 @@ +package com.szy.demo.controller.vo.response; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class CommonResponse { + + private Integer code; + private String msg; + private T data; + + public CommonResponse(Integer code, String msg, T data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + public static CommonResponse success(T data) { + return new CommonResponse<>(0, "success", data); + } + +} diff --git a/demo/src/main/java/com/szy/demo/httpcenter/HttpRequest.java b/demo/src/main/java/com/szy/demo/httpcenter/HttpRequest.java new file mode 100644 index 0000000..2d89741 --- /dev/null +++ b/demo/src/main/java/com/szy/demo/httpcenter/HttpRequest.java @@ -0,0 +1,21 @@ +package com.szy.demo.httpcenter; + +import com.szy.core.httpcenter.SzyHttpMethod; +import com.szy.core.httpcenter.annotation.*; +import com.szy.demo.controller.vo.request.HttpTestRequest; +import com.szy.demo.controller.vo.response.CommonResponse; + +@SHttpCenter +@SHttpPath("http://localhost:8080") +public interface HttpRequest { + @SHttpSubPath("/test/echo/{0}") + @SHttpMethod(SzyHttpMethod.POST) + @SHttpHeader(key = "content-type", value = "application/json") + @SHttpHeader(key = "szy-header", value = "yyds") + CommonResponse httpPostRequest( + @SPathVar("userId") int userId, + @SRequestParam("from") String from, + @SRequestParam("to") String to, + @SHttpBody HttpTestRequest body + ); +} diff --git a/demo/src/main/resources/application.properties b/demo/src/main/resources/application.properties index 587be19..c70f906 100644 --- a/demo/src/main/resources/application.properties +++ b/demo/src/main/resources/application.properties @@ -1,3 +1,4 @@ llj=100 susername=llj spassword=lljpw +server.port=8000