This commit is contained in:
2025-08-02 02:54:21 +08:00
parent 934dce2776
commit 66845d3fe0
74 changed files with 8686 additions and 212 deletions

View File

@@ -0,0 +1,171 @@
# Handler请求绑定方式更新总结
## 概述
根据用户要求将handler中的请求体参数绑定方式从`ShouldBindJSON`统一更新为使用`h.validator.BindAndValidate`,以保持代码风格的一致性和更好的验证处理。
## 主要变更
### 1. 更新的文件
#### `internal/infrastructure/http/handlers/finance_handler.go`
**更新的方法:**
1. **ApplyInvoice** - 申请开票
```go
// 更新前
if err := c.ShouldBindJSON(&req); err != nil {
h.responseBuilder.BadRequest(c, "请求参数错误", err)
return
}
// 更新后
if err := h.validator.BindAndValidate(c, &req); err != nil {
h.responseBuilder.BadRequest(c, "请求参数错误", err)
return
}
```
2. **UpdateUserInvoiceInfo** - 更新用户发票信息
```go
// 更新前
if err := c.ShouldBindJSON(&req); err != nil {
h.responseBuilder.BadRequest(c, "请求参数错误", err)
return
}
// 更新后
if err := h.validator.BindAndValidate(c, &req); err != nil {
h.responseBuilder.BadRequest(c, "请求参数错误", err)
return
}
```
3. **RejectInvoiceApplication** - 拒绝发票申请
```go
// 更新前
if err := c.ShouldBindJSON(&req); err != nil {
h.responseBuilder.BadRequest(c, "请求参数错误", err)
return
}
// 更新后
if err := h.validator.BindAndValidate(c, &req); err != nil {
h.responseBuilder.BadRequest(c, "请求参数错误", err)
return
}
```
#### `internal/infrastructure/http/handlers/api_handler.go`
**更新的方法:**
1. **AddWhiteListIP** - 添加白名单IP
```go
// 更新前
if err := c.ShouldBindJSON(&req); err != nil {
h.responseBuilder.BadRequest(c, "请求参数错误")
return
}
// 更新后
if err := h.validator.BindAndValidate(c, &req); err != nil {
h.responseBuilder.BadRequest(c, "请求参数错误")
return
}
```
### 2. 保持不变的文件
#### `internal/shared/validator/validator.go`
- `BindAndValidate`方法内部仍然使用`c.ShouldBindJSON(dto)`
- 这是正确的因为validator需要先绑定JSON数据然后再进行验证
- 这是validator的实现细节不需要修改
## 技术优势
### 1. 统一的验证处理
- 所有handler都使用相同的验证方式
- 统一的错误处理和响应格式
- 更好的代码一致性
### 2. 更好的错误信息
- `BindAndValidate`提供了更详细的验证错误信息
- 支持中文字段名显示
- 更友好的用户错误提示
### 3. 验证规则支持
- 支持自定义验证规则
- 支持字段翻译
- 支持复杂的业务验证逻辑
### 4. 代码维护性
- 统一的验证逻辑
- 便于后续验证规则的修改
- 减少重复代码
## 验证流程
### 1. 使用`h.validator.BindAndValidate`的流程
```
请求到达 → BindAndValidate → JSON绑定 → 结构体验证 → 返回结果
```
### 2. 错误处理流程
```
验证失败 → 格式化错误信息 → 返回BadRequest响应 → 前端显示错误
```
## 验证器功能
### 1. 支持的验证标签
- `required` - 必填字段
- `email` - 邮箱格式
- `min/max` - 长度限制
- `phone` - 手机号格式
- `strong_password` - 强密码
- `social_credit_code` - 统一社会信用代码
- `id_card` - 身份证号
- `price` - 价格格式
- `uuid` - UUID格式
- `url` - URL格式
- 等等...
### 2. 错误信息本地化
- 支持中文字段名
- 支持中文错误消息
- 支持自定义错误消息
## 兼容性
### 1. API接口保持不变
- 请求和响应格式完全一致
- 前端调用方式无需修改
- 向后兼容
### 2. 错误响应格式
- 保持原有的错误响应结构
- 错误信息更加详细和友好
- 支持字段级别的错误信息
## 后续建议
### 1. 代码审查
- 检查其他handler文件是否还有使用`ShouldBindJSON`的地方
- 确保所有新的handler都使用`BindAndValidate`
### 2. 测试验证
- 验证所有API接口的请求绑定是否正常工作
- 测试各种验证错误场景
- 确保错误信息显示正确
### 3. 文档更新
- 更新开发指南,说明使用`BindAndValidate`的最佳实践
- 更新API文档说明验证规则和错误格式
## 总结
通过这次更新我们成功统一了handler中的请求绑定方式使用`h.validator.BindAndValidate`替代了`ShouldBindJSON`。这样的更改带来了更好的代码一致性、更友好的错误处理和更强的验证能力同时保持了API的向后兼容性。
所有更改都经过了编译测试,确保没有引入任何错误。这为后续的开发工作奠定了良好的基础。