GoFrame基本使用
请求验证
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
)
type LoginValidate struct {
UserName string `p:"username" v:"required|length:3,8 #请输入账号|账号长度为:min到:max位"`
Password string `p:"password" v:"required|length:6,8 #请输入密码|密码长度为:min到:max位"`
}
type Response struct {
Success bool `json:"success"`
Message string `json:"message"`
Results interface{} `json:"results"`
}
func user(r *ghttp.Request) {
var loginValidate *LoginValidate
err := r.Parse(&loginValidate)
if err != nil {
r.Response.WriteJson(Response{
Success: false,
Message: err.Error(),
})
return
}
// DO YOUR WORK HERE
r.Response.WriteJson(Response{
Success: true,
Message: "登录成功!",
})
}
func main() {
server := g.Server()
server.BindHandler("/user", user)
server.SetPort(80)
server.Run()
}
gf提供了表单验证功能,开发者可以自定义表单验证规则
调用r.Parse方法,传入表单验证的结构体指针的地址即可,如果表单验证失败,则返回error,error的Error方法返回的字符串即为自定表单验证器时定义的错误匹配的提示结果。
表单验证结构体
如上,验证规则写入结构体的tag中
- p:从表单中获取需要验证的数据的key
- v:定义验证规则;验证规则分为2个部分,它们以#号分割,第一部门为验证规则,第二部门为验证出错的提示。它们的对应关系为所在的先后位置相对应。不同的验证规则和提示之间以|符分割。
校验规则
校验规则可以接受参数,不同的参数以逗号分隔
required
: 无参数- 必须参数,当参数不存在时返回异常
length
:2个参数,min_length, max_length int
- 字段的长度的范围,对用于字符串,当获取的值不在定义的范围之内的时候返回异常,注意中文一个汉字占3字节
date
: 无参数- 检验字段是否为date类型的字符串,如: 2006-01-02, 20060102, 2006.01.02
date-format
:接受一个时间类型格式的字符串- 判断接受的时间日期格式是否为制定的时间日期格式
email
: 无参数- 判断是否为邮箱格式的字符串
phone
:无参数- 判断是否为手机号码格式的字符串
same
: 字段的名称- 判断当前的字段值是否和给定的字段的值相等
更多校验规则:https://goframe.org/util/gvalid/index
中间件
package main
import (
"fmt"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
)
func Middleware1(r *ghttp.Request) {
fmt.Println("Middleware1")
r.Middleware.Next()
}
func Middleware2(r *ghttp.Request) {
fmt.Println("Middleware2")
r.Middleware.Next()
}
func Middleware3(r *ghttp.Request) {
fmt.Println("Middleware3")
r.Middleware.Next()
}
func main() {
server := g.Server()
// 绑定全局中间件
server.BindMiddlewareDefault(Middleware3)
userGroup := server.Group("/user")
{
// 局部中间件
userGroup.Middleware(Middleware1, Middleware2)
userGroup.GET("/login", func(r *ghttp.Request) {
r.Response.Write("login page")
})
}
server.SetPort(80)
server.Run()
}
中间件的执行顺序 全局 > 局部,如果传入个中间件,那么会按照参数的顺序执行
上下文
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
)
func Middleware2(r *ghttp.Request) {
r.SetCtxVar("age", 24)
r.Middleware.Next()
}
func Middleware3(r *ghttp.Request) {
r.SetCtxVar("username", "ivy")
r.Middleware.Next()
}
func main() {
server := g.Server()
// 绑定全局中间件
server.BindMiddlewareDefault(Middleware3)
userGroup := server.Group("/user")
{
// 局部中间件
userGroup.Middleware(Middleware2)
userGroup.GET("/ctx", func(r *ghttp.Request) {
r.Response.Write(r.GetCtxVar("username"))
r.Response.Write(r.GetCtxVar("age"))
})
}
server.SetPort(80)
server.Run()
}
可以在SetCtxVar
里面设置上下文,然后在这个请求的生命周期中的别的函数里拿到之前设置的context
gf还提供了另外一种方法来实现上下文的传递。通过SetParam
来设置上下文,通过GetParamVar
获取上下文