实现原理

@Component("ApiResponseGlobalFilter")其核心原理基于Spring的过滤器(Filter)或拦截器(Interceptor)机制,结合AOP(面向切面编程)实现统一响应封装。

  1. 过滤器/拦截器机制
    通过实现HandlerInterceptorFilter接口,在请求处理前后插入逻辑。例如,在postHandle方法中对控制器返回的数据进行统一包装。

  2. AOP切面处理
    使用@Around注解拦截控制器方法,在方法执行后对返回值进行修改。例如,将原始数据包装为固定格式的ResponseEntity

  3. 响应封装逻辑
    定义统一的响应结构(如codemessagedata字段),在过滤器中捕获控制器返回值并转换为该结构。

经典使用场景

  1. 统一响应格式
    所有API返回{code: 200, message: "success", data: ...}格式,避免每个接口手动封装。

  2. 异常统一处理
    捕获控制器抛出的异常,转换为规范化的错误响应(如code: 500, message: "系统错误")。

  3. 数据脱敏
    在全局过滤器中扫描响应数据,对敏感字段(如手机号、身份证号)自动脱敏。

  4. 接口耗时统计
    通过拦截器的preHandlepostHandle记录接口执行时间,附加到响应头中。

  5. 跨域支持
    直接在过滤器中添加Access-Control-Allow-Origin等头部,避免重复配置。

示例:

统一响应格式:在Gateway中实现响应标准化过滤器

在Spring Cloud Gateway中实现响应标准化过滤器,能够统一处理所有微服务的响应格式。以下是关键步骤:

创建全局过滤器类 定义一个实现GlobalFilterOrdered接口的组件类,使用@Component注解标记:

@Component("ApiResponseGlobalFilter")
public class ApiResponseGlobalFilter implements GlobalFilter, Ordered {
    private static final ObjectMapper objectMapper = new ObjectMapper();
}

重写filter方法 在filter方法中拦截响应并重新封装:

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    ServerHttpResponse originalResponse = exchange.getResponse();
    DataBufferFactory bufferFactory = originalResponse.bufferFactory();
    
    // 包装原始响应
    ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
        @Override
        public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
            if (body instanceof Flux) {
                return super.writeWith(processResponseBody((Flux<DataBuffer>) body, bufferFactory));
            }
            return super.writeWith(body);
        }
    };
    return chain.filter(exchange.mutate().response(decoratedResponse).build());
}

处理响应体 通过Flux操作符修改响应内容:

private Flux<DataBuffer> processResponseBody(Flux<DataBuffer> body, DataBufferFactory bufferFactory) {
    return body.flatMap(dataBuffer -> {
        try {
            byte[] content = new byte[dataBuffer.readableByteCount()];
            dataBuffer.read(content);
            String responseBody = new String(content, StandardCharsets.UTF_8);
            
            // 将原始响应解析为JSON对象
            JsonNode jsonNode = objectMapper.readTree(responseBody);
            
            // 构建标准响应格式
            StandardResponse standardResponse = new StandardResponse(
                jsonNode.has("code") ? jsonNode.get("code").asInt() : 200,
                jsonNode.has("message") ? jsonNode.get("message").asText() : "success",
                jsonNode
            );
            
            // 序列化为字节数组
            byte[] newContent = objectMapper.writeValueAsBytes(standardResponse);
            return Mono.just(bufferFactory.wrap(newContent));
        } catch (Exception e) {
            return Mono.error(e);
        }
    });
}

设置执行顺序 确保过滤器在响应处理最后阶段执行:

@Override
public int getOrder() {
    return -100;
}

标准化响应体结构

定义统一的响应格式类:

@Data
@AllArgsConstructor
public class StandardResponse {
    private int code;
    private String message;
    private Object data;
}

技术优势

提升开发效率 前端团队无需针对不同微服务调整解析逻辑,统一采用相同响应格式处理所有接口数据。

增强系统可维护性 通过标准化的错误代码和消息字段,快速区分业务异常(如400系列)和系统异常(如500系列),简化日志分析和问题排查。

保持架构一致性 所有经过API网关的响应自动转换为统一结构,消除因服务独立开发导致的格式差异,保证系统整体规范性。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐