第38章 Iris 框架中的 YAML 请求处理
YAML 请求
学习如何在 Iris 中处理 YAML 请求体。
基础 YAML 处理
```gopackage main
import ( "github.com/kataras/iris/v12" "gopkg.in/yaml.v3" )
type Config struct { Name string `yaml:"name"` Version string `yaml:"version"` Features []string `yaml:"features"` }
func main() { app := iris.New()
app.Post("/yaml", func(ctx iris.Context) { var config Config if err := ctx.ReadYAML(&config); err != nil { ctx.StopWithError(iris.StatusBadRequest, err) return }
ctx.JSON(iris.Map{ "received": config, }) })
app.Listen(":8080") } ```
YAML 验证
```go type Service struct { Name string `yaml:"name" validate:"required"` Port int `yaml:"port" validate:"required,min=1024,max=65535"` Replicas int `yaml:"replicas" validate:"required,min=1"` }
app.Post("/validate", func(ctx iris.Context) { var service Service if err := ctx.ReadYAML(&service); err != nil { ctx.StopWithError(iris.StatusBadRequest, err) return }
// 验证结构体 if err := validate.Struct(service); err != nil { ctx.StopWithProblem(iris.StatusBadRequest, iris.NewProblem(). Title("Validation Error"). DetailErr(err)) return }
ctx.JSON(iris.Map{ "message": "YAML 验证成功", "service": service, }) }) ```
自定义 YAML 解码器
```go app.Post("/custom", func(ctx iris.Context) { decoder := yaml.NewDecoder(ctx.Request().Body) decoder.KnownFields(true)
var data interface{} if err := decoder.Decode(&data); err != nil { ctx.StopWithError(iris.StatusBadRequest, err) return }
ctx.JSON(iris.Map{ "data": data, }) }) ```
最佳实践: 验证:校验 schema、检查必填字段、处理类型、设置限制、记录需求 安全:校验输入、设置大小限制、检查结构、监控使用、处理错误 性能:使用合适的解码器、处理大型文档、监控内存、实现超时、清理资源 错误处理:提供清晰信息、处理验证错误、记录问题、记录错误、测试边缘用例