diff --git a/backend-rewrite-tasklist/01_M0_M2_FOUNDATION_AND_AUTH.md b/backend-rewrite-tasklist/01_M0_M2_FOUNDATION_AND_AUTH.md index cf63bc89..d98e0b5e 100644 --- a/backend-rewrite-tasklist/01_M0_M2_FOUNDATION_AND_AUTH.md +++ b/backend-rewrite-tasklist/01_M0_M2_FOUNDATION_AND_AUTH.md @@ -104,7 +104,8 @@ 交付物:[../server-rs/apps/api-server/src/api_response.rs](../server-rs/apps/api-server/src/api_response.rs)、[../server-rs/apps/api-server/src/request_context.rs](../server-rs/apps/api-server/src/request_context.rs)、[../server-rs/apps/api-server/src/http_error.rs](../server-rs/apps/api-server/src/http_error.rs) - [x] 接入 `x-request-id` 交付物:[../server-rs/apps/api-server/src/response_headers.rs](../server-rs/apps/api-server/src/response_headers.rs)、[../server-rs/apps/api-server/src/app.rs](../server-rs/apps/api-server/src/app.rs) -- [ ] 接入 `x-api-version` +- [x] 接入 `x-api-version` + 交付物:[../server-rs/apps/api-server/src/response_headers.rs](../server-rs/apps/api-server/src/response_headers.rs) - [ ] 接入 `x-route-version` - [ ] 接入 `x-response-time-ms` - [ ] 实现 `/healthz` diff --git a/server-rs/apps/api-server/README.md b/server-rs/apps/api-server/README.md index 0891e816..51dddaf7 100644 --- a/server-rs/apps/api-server/README.md +++ b/server-rs/apps/api-server/README.md @@ -57,6 +57,12 @@ 2. `json_success_body(...)` / `json_error_body(...)` 会根据 `x-genarrative-response-envelope` 自动在“裸数据 / 标准 envelope / legacy error + meta”之间切换。 3. `meta.apiVersion`、`meta.requestId`、`meta.routeVersion`、`meta.operation`、`meta.latencyMs`、`meta.timestamp` 已按当前前端契约生成,响应头回写仍留给后续独立任务。 +当前基础响应头约定: + +1. 所有响应都会回写 `x-request-id`。 +2. 所有响应都会回写固定的 `x-api-version`,当前值与 body `meta.apiVersion` 保持一致。 +3. `x-route-version` 与 `x-response-time-ms` 仍留在后续独立任务中补齐。 + ## 3. 边界约束 1. `api-server` 负责 HTTP、SSE、Cookie、Header、路由与协议装配。 diff --git a/server-rs/apps/api-server/src/response_headers.rs b/server-rs/apps/api-server/src/response_headers.rs index ca95909b..ba5dc214 100644 --- a/server-rs/apps/api-server/src/response_headers.rs +++ b/server-rs/apps/api-server/src/response_headers.rs @@ -5,7 +5,12 @@ use axum::{ response::Response, }; -use crate::request_context::{resolve_request_id, X_REQUEST_ID_HEADER}; +use crate::{ + api_response::API_VERSION, + request_context::{resolve_request_id, X_REQUEST_ID_HEADER}, +}; + +pub const API_VERSION_HEADER: &str = "x-api-version"; pub async fn propagate_request_id_header(request: Request, next: Next) -> Response { let request_id = resolve_request_id(&request); @@ -19,5 +24,11 @@ pub async fn propagate_request_id_header(request: Request, next: Next) -> Respon } } + if let Ok(header_value) = HeaderValue::from_str(API_VERSION) { + response + .headers_mut() + .insert(HeaderName::from_static(API_VERSION_HEADER), header_value); + } + response }