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

第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 - 提供详情信息 - 明确文档化响应格式 - 妥善处理扩展字段

实现要点: - 保持格式一致 - 错误信息清晰 - 使用正确的状态码 - 做好错误处理 - 写清用法文档

安全方面: - 校验输入 - 转义输出 - 设置正确的响应头 - 监控使用情况 - 保护敏感数据

日常维护: - 文档化各类型 - 及时更新结构 - 监控变更 - 定期测试 - 复查安全

评论 (0)