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
獲取上下文