第53章 Go Iris 框架中 Problem Details 响应详解
Problem Details Response
学习如何按照 RFC 7807 规范发送 Problem Details(问题详情)响应。
Basic Problem Response
```go package main
import "github.com/kataras/iris/v12"
func main() { app := iris.New()
app.Get("/problem", func(ctx iris.Context) { problem := iris.NewProblem(). Title("Validation Error"). Type("/validation-error"). Status(iris.StatusBadRequest). Detail("One or more fields failed validation"). Key("errors", []string{ "email is required", "password is too short", })
ctx.Problem(problem) })
app.Listen(":8080") } ```
Custom Problem Types
```go type ValidationProblem struct { *iris.Problem Fields map[string]string `json:"fields,omitempty"` }
app.Post("/validate", func(ctx iris.Context) { problem := &ValidationProblem{ Problem: iris.NewProblem(). Title("Validation Failed"). Type("/validation-error"). Status(iris.StatusBadRequest), Fields: map[string]string{ "email": "invalid format", "age": "must be over 18", }, }
ctx.Problem(problem) }) ```
Problem Middleware
```go func problemMiddleware(ctx iris.Context) { defer func() { if err := recover(); err != nil { problem := iris.NewProblem(). Title("Internal Server Error"). Type("/server-error"). Status(iris.StatusInternalServerError). DetailErr(err.(error))
ctx.Problem(problem) } }()
ctx.Next() }
app.Use(problemMiddleware) ```
Best Practices
结构规范: - 遵循 RFC 7807 - 使用合理的 type - 提供详情信息 - 明确文档化响应格式 - 妥善处理扩展字段
实现要点: - 保持格式一致 - 错误信息清晰 - 使用正确的状态码 - 做好错误处理 - 写清用法文档
安全方面: - 校验输入 - 转义输出 - 设置正确的响应头 - 监控使用情况 - 保护敏感数据
日常维护: - 文档化各类型 - 及时更新结构 - 监控变更 - 定期测试 - 复查安全