Skip to content

Commit

Permalink
refactor(excel): 使用 spring interface 重构网络请求
Browse files Browse the repository at this point in the history
  • Loading branch information
lltx committed Sep 7, 2024
1 parent 74cedc8 commit d07141a
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 46 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,21 @@
package com.pig4cloud.pig.common.excel;

import com.pig4cloud.pig.common.core.constant.SecurityConstants;
import com.pig4cloud.pig.common.core.constant.ServiceNameConstants;
import com.pig4cloud.pig.common.core.util.SpringContextHolder;
import com.pig4cloud.pig.common.excel.provider.RemoteDictApiService;
import com.pig4cloud.pig.common.excel.provider.RemoteDictDataProvider;
import com.pig4cloud.plugin.excel.handler.DictDataProvider;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.client.RestClient;
import org.springframework.web.client.support.RestClientAdapter;
import org.springframework.web.service.invoker.HttpServiceProxyFactory;

import java.util.Optional;

/**
* excel 自动装配类
Expand All @@ -17,24 +27,55 @@
public class ExcelAutoConfiguration {

/**
* REST 模板
* @return {@link RestTemplate }
* REST 客户端构建器(支持负载均衡)
* @return {@link RestClient.Builder }
*/
@Bean
@LoadBalanced
@ConditionalOnProperty(value = "spring.cloud.nacos.discovery.enabled", havingValue = "true", matchIfMissing = true)
RestClient.Builder restClientBuilder() {
return RestClient.builder();
}

/**
* 远程 dict API 服务
* @return {@link RemoteDictApiService }
*/
@Bean
@ConditionalOnMissingBean
public RestTemplate restTemplate() {
return new RestTemplate();
public RemoteDictApiService remoteDictApiService(Optional<RestClient.Builder> restClientBuilderOptional) {
RestClient client = restClientBuilderOptional.orElseGet(RestClient::builder)
.baseUrl(getBaseUrl())
.defaultHeader(SecurityConstants.FROM, SecurityConstants.FROM_IN)
.build();
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(RestClientAdapter.create(client)).build();
return factory.createClient(RemoteDictApiService.class);
}

/**
* dict 数据提供程序
* @param restTemplate REST 模板
* @param remoteDictApiService 远程 dict API 服务
* @return {@link DictDataProvider }
*/
@Bean
@ConditionalOnMissingBean
public DictDataProvider dictDataProvider(RestTemplate restTemplate) {
return new RemoteDictDataProvider(restTemplate);
public DictDataProvider dictDataProvider(RemoteDictApiService remoteDictApiService) {
return new RemoteDictDataProvider(remoteDictApiService);
}

/**
* 获取Base URL
* @return {@link String }
*/
private String getBaseUrl() {
// 根据当前架构模式,组装URL
if (SpringContextHolder.isMicro()) {
return String.format("http://%s", ServiceNameConstants.UPMS_SERVICE);
}
else {
return String.format("http://%s", SpringContextHolder.getEnvironment()
.resolvePlaceholders("127.0.0.1:${server.port}${server.servlet.context-path}"));
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.pig4cloud.pig.common.excel.provider;

import com.pig4cloud.pig.common.core.util.R;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.service.annotation.GetExchange;

import java.util.List;
import java.util.Map;

/**
* 字典接口, 基于 RestClient GetExchange 实现
*
* @author lengleng
* @date 2024/9/7
*/
public interface RemoteDictApiService {

/**
* 按类型获取 dict
* @param type 类型
* @return {@link R }<{@link List }<{@link Map }<{@link String }, {@link Object }>>>
*/
@GetExchange("/dict/remote/type/{type}")
R<List<Map<String, Object>>> getDictByType(@PathVariable String type);

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,11 @@

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import com.pig4cloud.pig.common.core.constant.SecurityConstants;
import com.pig4cloud.pig.common.core.constant.ServiceNameConstants;
import com.pig4cloud.pig.common.core.util.R;
import com.pig4cloud.pig.common.core.util.SpringContextHolder;
import com.pig4cloud.plugin.excel.handler.DictDataProvider;
import com.pig4cloud.plugin.excel.vo.DictEnum;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

Expand All @@ -28,7 +19,7 @@
@RequiredArgsConstructor
public class RemoteDictDataProvider implements DictDataProvider {

private final RestTemplate restTemplate;
private final RemoteDictApiService remoteDictApiService;

/**
* 获取 dict
Expand All @@ -37,18 +28,8 @@ public class RemoteDictDataProvider implements DictDataProvider {
*/
@Override
public DictEnum[] getDict(String type) {
// 获取服务URL
String serviceUrl = getServiceUrl(type);
// 创建请求实体
HttpHeaders headers = new HttpHeaders();
headers.add(SecurityConstants.FROM, SecurityConstants.FROM_IN);
HttpEntity<Void> requestEntity = new HttpEntity<>(headers);
// 发送HTTP请求并获取响应
ResponseEntity<Map> response = restTemplate.exchange(serviceUrl, HttpMethod.GET, requestEntity, Map.class,
type);

// 解析响应数据
List<Map<String, Object>> dictDataList = MapUtil.get(response.getBody(), R.Fields.data, ArrayList.class);
R<List<Map<String, Object>>> dictDataListR = remoteDictApiService.getDictByType(type);
List<Map<String, Object>> dictDataList = dictDataListR.getData();
if (CollUtil.isEmpty(dictDataList)) {
return new DictEnum[0];
}
Expand All @@ -64,20 +45,4 @@ public DictEnum[] getDict(String type) {
return dictEnumBuilder.build();
}

/**
* 获取服务 URL
* @param param 参数
* @return {@link String }
*/
private String getServiceUrl(String param) {
// 根据当前架构模式,组装URL
if (SpringContextHolder.isMicro()) {
return String.format("http://%s/dict/remote/type/%s", ServiceNameConstants.UPMS_SERVICE, param);
}
else {
return String.format("http://%s/dict/remote/type/%s", SpringContextHolder.getEnvironment()
.resolvePlaceholders("127.0.0.1:${server.port}${server.servlet.context-path}"), param);
}
}

}

0 comments on commit d07141a

Please sign in to comment.