refactor(api): 统一 HTTP 200 响应契约
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user