GET请求数据量大造成的问题
在实际的开发过程中,我们偶尔或者遇到过要导出列表中所有的数据。假设列表中有十万条数据,那么导出所有,意味着要大批量的走查询接口,通常我们的后台的API接口GET请求支持的查询长度不得大于1000,(比如我根据一千个用户id查询用户的真实姓名),那么GET请求显然不太支持,解决办法可以使用Post请求。当然如果不改的话其实也有笨方法。如果在实际开发过程中能帮助你解决问题实在是很高兴。解决方法如下。
- 我们可以把接口请求GET 改为Post ,使用@RequestBody传递参数。
- 我们可以使用递归的方式进行分批查询。也是解决的方法之一。具体实现如下
封装了一个工具类
UserInfoManager
定义了一个常量 一次性查询3000条
private final Double SEPARATE = 3000D;
public Map<String, UserInfoDto> getByUserIds(List<String> userIds) {
if (CollectionUtils.isEmpty(userIds)) {
return Maps.newHashMap();
}
if (userIds.size() <= SEPARATE) {
return getgUserMapByIds(userIds);
}
Map<String, UserInfoDto> all = new HashMap<>(16);
double x = Math.ceil(userIds.size() / SEPARATE);
int start = 0;
int end = 0;
for (int i = 0; i < x; i++) {
end = (int) ((i + 1) * SEPARATE);
end = end > userIds.size() ? userIds.size() : end;
all.putAll(getgUserMapByIds(userIds.subList(start, end)));
start = end;
}
return all;
}
public Map<String, DaPengUserResource> getgUserMapByIds(List<String> userIds) {
// 根据userIds查询user微服务
List<UserInfoDto> userLists = userClient.getUserByIds(userIds);
if (!CollectionUtils.isEmpty(userLists )) {
return a.stream().collect(Collectors.toMap(UserInfoDto::getUserId, c -> c));
} else {
return Maps.newHashMap();
}
}