Problem Details Response
Learn how to send Problem Details responses according to RFC 7807.
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
Structure:
- Follow RFC 7807
- Use proper types
- Include details
- Document format
- Handle extensions
Implementation:
- Consistent format
- Clear messages
- Proper status codes
- Handle errors
- Document usage
Security:
- Validate input
- Escape output
- Set headers
- Monitor usage
- Handle sensitive data
Maintenance:
- Document types
- Update structure
- Monitor changes
- Regular testing
- Review security