要将请求正文绑定到类型,请使用模型绑定。iris目前支持JSON, JSONProtobuf, Protobuf, MsgPack,XML和YAML标准表单值 (foo=bar&boo=baz) 的绑定
ReadJSON(outPtr interface{}) error
ReadJSONProtobuf(ptr proto.Message, opts ...ProtoUnmarshalOptions) error
ReadProtobuf(ptr proto.Message) error
ReadMsgPack(ptr interface{}) error
ReadXML(outPtr interface{}) error
ReadYAML(outPtr interface{}) error
ReadForm(formObject interface{}) error
ReadQuery(ptr interface{}) error
当使用ReadBody
时,Iris会根据Content-Type
标头尝试推断绑定器。如果你确定要绑定什么,你可以使用特定的ReadXXX
方法,例如ReadJSON
或ReadProtobuf
等方法
ReadBody(ptr interface{}) error
Iris 没有内置数据验证功能。 但是,它确实允许您附加一个验证器,该验证器将自动调用 ReadJSON
、ReadXML
等方法。在此示例中,我们将学习如何使用 go-playground/validator/v10
进行请求正文验证。
注意,您需要在想要绑定的所有字段上设置相应的绑定标记。例如,当从JSON绑定时,设置JSON:"fieldname"
您还可以指定特定的字段是必需的。如果一个字段用binding:"required"
装饰,并且绑定时值为空,则会返回错误。
package main
import (
"fmt"
"github.com/kataras/iris/v12"
"github.com/go-playground/validator/v10"
)
func main() {
app := iris.New()
app.Validator = validator.New()
userRouter := app.Party("/user")
{
userRouter.Get("/validation-errors", resolveErrorsDocumentation)
userRouter.Post("/", postUser)
}
app.Listen(":8080")
}
// User contains user information.
type User struct {
FirstName string `json:"fname" validate:"required"`
LastName string `json:"lname" validate:"required"`
Age uint8 `json:"age" validate:"gte=0,lte=130"`
Email string `json:"email" validate:"required,email"`
FavouriteColor string `json:"favColor" validate:"hexcolor|rgb|rgba"`
Addresses []*Address `json:"addresses" validate:"required,dive,required"`
}
// Address houses a users address information.
type Address struct {
Street string `json:"street" validate:"required"`
City string `json:"city" validate:"required"`
Planet string `json:"planet" validate:"required"`
Phone string `json:"phone" validate:"required"`
}
type validationError struct {
ActualTag string `json:"tag"`
Namespace string `json:"namespace"`
Kind string `json:"kind"`
Type string `json:"type"`
Value string `json:"value"`
Param string `json:"param"`
}
func wrapValidationErrors(errs validator.ValidationErrors) []validationError {
validationErrors := make([]validationError, 0, len(errs))
for _, validationErr := range errs {
validationErrors = append(validationErrors, validationError{
ActualTag: validationErr.ActualTag(),
Namespace: validationErr.Namespace(),
Kind: validationErr.Kind().String(),
Type: validationErr.Type().String(),
Value: fmt.Sprintf("%v", validationErr.Value()),
Param: validationErr.Param(),
})
}
return validationErrors
}
func postUser(ctx iris.Context) {
var user User
err := ctx.ReadJSON(&user)
if err != nil {
// Handle the error, below you will find the right way to do that...
if errs, ok := err.(validator.ValidationErrors); ok {
// Wrap the errors with JSON format, the underline library returns the errors as interface.
validationErrors := wrapValidationErrors(errs)
// Fire an application/json+problem response and stop the handlers chain.
ctx.StopWithProblem(iris.StatusBadRequest, iris.NewProblem().
Title("Validation error").
Detail("One or more fields failed to be validated").
Type("/user/validation-errors").
Key("errors", validationErrors))
return
}
// It"s probably an internal JSON error, let"s dont give more info here.
ctx.StopWithStatus(iris.StatusInternalServerError)
return
}
ctx.JSON(iris.Map{"message": "OK"})
}
func resolveErrorsDocumentation(ctx iris.Context) {
ctx.WriteString("A page that should document to web developers or users of the API on how to resolve the validation errors")
}
request样例
{
"fname": "",
"lname": "",
"age": 45,
"email": "mail@example.com",
"favColor": "#000",
"addresses": [{
"street": "Eavesdown Docks",
"planet": "Persphone",
"phone": "none",
"city": "Unknown"
}]
}
response样例
{
"title": "Validation error",
"detail": "One or more fields failed to be validated",
"type": "http://localhost:8080/user/validation-errors",
"status": 400,
"fields": [
{
"tag": "required",
"namespace": "User.FirstName",
"kind": "string",
"type": "string",
"value": "",
"param": ""
},
{
"tag": "required",
"namespace": "User.LastName",
"kind": "string",
"type": "string",
"value": "",
"param": ""
}
]
}
了解更多关于模型验证的信息:https://github.com/go-playground/validator/tree/master/_examples
我们首先创建一个存放模板文件的templates文件夹,然后在其内部写入一个index.html,代码如下!DOCTYPE htmlhtml lang="en"headme...
在Gin框架中记录日志方法如下package mainimport ("io""os""github.com/gin-gonic/gin")func main() {// 禁用控制台颜色,将日志...
你想优雅地重启或停止web服务器吗?有一些方法可以做到这一点。我们可以使用fvbock/endless来替换默认的ListenAndServer...
用于写入和读取非阻塞文件和套接字的实用程序类。主要有:BaseIOStream:用于读写的通用接口。IOStream:使用非阻塞套接...
修改源文件时自动重启服务器。大多数应用程序不应直接访问此模块。相反,将关键字参数autoreload=True传递给tornado.web.A...
警告这是一个比较高级的话题。如果您从FastAPI开始,您可能不需要这个。您可以声明额外的响应,包括额外的状态代码、媒体类型、...
使用Response参数你可以Response在你的路径操作函数中声明一个 type 的参数(就像你可以为 cookie 做的那样)。然后您可以在该时...
使用FastAPI,你可以定义、校验、记录文档并使用任意深度嵌套的模型(归功于Pydantic)。List 字段你可以将一个属性定义为拥有子...
File用于定义客户端的上传文件。说明因为上传文件以「表单数据」形式发送。所以接收上传文件,要预先安装python-multipart。例如...
可以在 PyPI 搜索 标记为Framework :: Flask扩展包,并且可以通过easy_install或pip下载。如果你把一个 Flask 扩展添加...