# REST 服务教程
## 目标
用 `rs-zero` 的 `rest` feature 启动一个可验证的 HTTP 服务,并理解统一响应、错误处理和服务边界。
## 前置条件
先完成 [快速开始](../getting-started.md) 的 workspace 验证。
## 运行现有示例
```bash
cargo run -p rest-hello
```
验证 ready endpoint:
```bash
curl http://127.0.0.1:8080/ready
```
示例入口在 `examples/rest-hello/src/main.rs`。它使用:
- `init_tracing(LogConfig::default())` 初始化 tracing。
- `ApiResponse::success("ok")` 返回统一响应。
- `RestServer::new(RestConfig::default(), router)` 启动 axum router。
- `shutdown_signal()` 处理优雅停机。
## 生成 REST skeleton
```bash
cargo run -p rs-zero-cli -- new-rest hello-service --dir target/generated
```
生成结果位于 `target/generated/hello-service/`。默认不会覆盖已存在文件。
## 关键约定
- REST 路由仍由 `axum::Router` 组织,rs-zero 不封死 axum 扩展点。
- 统一响应使用 `ApiResponse`,分页响应使用 `PageResponse`。
- 认证、超时、body limit、request-id 等能力在 `rs-zero` 的 `rest` 模块中以可组合边界提供。
- 业务错误应显式转换为 REST 错误,避免返回不可诊断的 panic。
## 验证
```bash
cargo test --test rest_integration
```
该测试覆盖 ready path、统一错误、JWT public path、request-id 和受保护路由。
## 常见问题
- 端口被占用:修改示例中的监听地址或停止占用进程。
- 返回格式不符合预期:检查 handler 是否返回 `ApiResponse` 或可被 axum 正确转换的类型。
- 认证失败:先确认 public path 配置和 JWT token 是否匹配测试中的配置。