package main import ( "github.com/kataras/iris/v12" ) func main() { app := iris.New() app.Post("/", logAllBody, logJSON, logFormValues, func(ctx iris.Context) { // body, err := io.ReadAll(ctx.Request().Body) once or body, err := ctx.GetBody() // as many times as you need. if err != nil { ctx.StopWithError(iris.StatusInternalServerError, err) return } if len(body) == 0 { ctx.WriteString(`The body was empty or iris.WithoutBodyConsumptionOnUnmarshal option is missing from app.Run. Check the terminal window for any queries logs.`) } else { ctx.WriteString("OK body is still:\n") ctx.Write(body) } }) // With ctx.UnmarshalBody, ctx.ReadJSON, ctx.ReadXML, ctx.ReadForm, ctx.FormValues // and ctx.GetBody methods the default golang and net/http behavior // is to consume the readen data - they are not available on any next handlers in the chain - // to change that behavior just pass the `WithoutBodyConsumptionOnUnmarshal` option. app.Listen(":8080", iris.WithoutBodyConsumptionOnUnmarshal) } func logAllBody(ctx iris.Context) { body, err := ctx.GetBody() if err == nil && len(body) > 0 { ctx.Application().Logger().Infof("logAllBody: %s", string(body)) } ctx.Next() } func logJSON(ctx iris.Context) { var p interface{} if err := ctx.ReadJSON(&p); err == nil { ctx.Application().Logger().Infof("logJSON: %#+v", p) } ctx.Next() } func logFormValues(ctx iris.Context) { values := ctx.FormValues() if values != nil { ctx.Application().Logger().Infof("logFormValues: %v", values) } ctx.Next() }