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