进阶 www.iris-go.com 2026-10-20 02:39:14 · 18 阅读

第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、检查必填字段、处理类型、设置限制、记录需求 安全:校验输入、设置大小限制、检查结构、监控使用、处理错误 性能:使用合适的解码器、处理大型文档、监控内存、实现超时、清理资源 错误处理:提供清晰信息、处理验证错误、记录问题、记录错误、测试边缘用例

评论 (0)