概述
spring/spring boot 返回的json数据,通常包含了对象所有的字段,有时候浪费流量。例如一个接口有10个字段,而前端只需要2个字段,都返回会浪费流量。
解决方案:前端在header中传递需要包含或需要排除的字段;后端在返回数据前进行统一拦截,只返回需要的字段。
具有有多种实现方式(这里只提供spring boot)。
首先约定返回的BaseResult对象格式如下,里面result属性就是实际各种数据对象。
{
"ret":0,
"msg":null,
"result":{
"id":1,
"name":"后摄像头53"
},
"time":1540972430498
}
实现方式一:通过AOP controller来实现
aop实现步骤说明:
- 判断返回的是不是BaseResult对象
- 判断request header或params是否有x-include-fields、x-exclude-fields属性(有则取出来放入set中)
- 满足以上条件则对BaseResult.result 对象进行处理,用Map替换result对象,Map只返回需要的字段。如果是Array或Collection则每个Item替换成一个Map。
import com.cehome.cloudbox.common.object.BaseResult;
import com.cehome.cloudbox.common.object.ItemsResult;
import com.cehome.cloudbox.common.object.PageResult;
import com.cehome.cloudbox.common.page.Page;
import com.cehomex.spring.feign.FeignRequestHolder;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.beans.PropertyDescriptor;
import java.util.*;
@Aspect
public class ControllerAOP {
private static String INCLUDE_FIELDS = "x-include-fields";
private static String EXCLUDE_FIELDS = "x-exclude-fields";
private static String P_INCLUDE_FIELDS = "x-include-fields";
private static String P_EXCLUDE_FIELDS = "x-exclude-fields";
private static final Logger logger = LoggerFactory.getLogger(ControllerAOP.class);
@Pointcut("within(@org.springframework.stereotype.Controller *)")
public void controller() {
}
@Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
public void restController() {
}
@Around("(controller() || restController()) && execution(public * *(..))")
public Object proceed(ProceedingJoinPoint joinPoint) throws Throwable {
try {
Object object=joinPoint.proceed();
ServletRequestAttribute