refactor(api): 统一 HTTP 200 响应契约

This commit is contained in:
2026-08-01 10:17:20 +08:00
parent f2e8935dbc
commit cad6c37af4
45 changed files with 689 additions and 289 deletions
@@ -2,11 +2,13 @@ package com.baiyue.common.core.api;
import org.springframework.http.HttpStatus;
import java.util.Arrays;
/**
* 统一接口结果码枚举,定义业务错误编码、默认消息和对应 HTTP 状态。
*/
public enum ResultCode {
SUCCESS("0", "success", HttpStatus.OK),
SUCCESS("200", "success", HttpStatus.OK),
BAD_REQUEST("A0400", "Bad request", HttpStatus.BAD_REQUEST),
UNAUTHORIZED("A0401", "Authentication required", HttpStatus.UNAUTHORIZED),
FORBIDDEN("A0403", "Access denied", HttpStatus.FORBIDDEN),
@@ -31,4 +33,15 @@ public enum ResultCode {
public String code() { return code; }
public String message() { return message; }
public HttpStatus httpStatus() { return httpStatus; }
/**
* 将下游统一响应中的业务码还原为本地结果码。
* 未知或空业务码按通用业务错误处理,避免把契约漂移误判为成功。
*/
public static ResultCode of(String code) {
return Arrays.stream(values())
.filter(value -> value.code.equals(code))
.findFirst()
.orElse(BUSINESS_ERROR);
}
}
@@ -7,6 +7,7 @@ import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.time.Instant;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -16,12 +17,22 @@ class ApiResponseTest {
@Test
void createsSuccessfulResponseWithCorrelationIds() {
ApiResponse<String> response = ApiResponse.success("ok", "request-1", "trace-1");
assertThat(response.code()).isEqualTo("200");
assertThat(response.code()).isEqualTo(ResultCode.SUCCESS.code());
assertThat(response.successful()).isTrue();
assertThat(response.requestId()).isEqualTo("request-1");
assertThat(response.timestamp()).isNotNull();
}
@Test
void resolvesKnownResultCodeAndFallsBackForUnknownCode() {
ApiResponse<Void> legacy = new ApiResponse<>("0", "legacy", null, null, null, Instant.now());
assertThat(legacy.successful()).isFalse();
assertThat(ResultCode.of("A0409")).isEqualTo(ResultCode.CONFLICT);
assertThat(ResultCode.of("UNKNOWN")).isEqualTo(ResultCode.BUSINESS_ERROR);
assertThat(ResultCode.of(null)).isEqualTo(ResultCode.BUSINESS_ERROR);
}
@Test
void pageResultIsImmutableAndRejectsInvalidMetadata() {
PageResult<String> result = new PageResult<>(List.of("a"), 1, 20, 1, 1);