新聞中心
?Request?對象支持非常完美的請求校驗?zāi)芰?,通過給結(jié)構(gòu)體屬性綁定?v?標(biāo)簽即可。

10年專注成都網(wǎng)站制作,成都企業(yè)網(wǎng)站定制,個人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識、方案,網(wǎng)站設(shè)計流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都企業(yè)網(wǎng)站定制,高端網(wǎng)頁制作,對LED顯示屏等多個方面,擁有多年的網(wǎng)站運(yùn)維經(jīng)驗。
需要注意的是,從?GOframe v1.16?版本開始,如果參數(shù)采用結(jié)構(gòu)化的輸入輸出管理,?HTTP?請求的數(shù)據(jù)校驗不再受結(jié)構(gòu)體默認(rèn)值的影響,底層調(diào)用的是?gvalid?組件的?CheckStructWithData?方法,即直接使用請求的參數(shù)執(zhí)行數(shù)據(jù)校驗,而給定的結(jié)構(gòu)體對象僅用于校驗規(guī)則和錯誤提示信息的定義管理。
示例1,基本使用
我們將之前的示例做下調(diào)整,增加?v?校驗標(biāo)簽。
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
// 注冊請求數(shù)據(jù)結(jié)構(gòu)
type RegisterReq struct {
Name string `p:"username" v:"required|length:4,30#請輸入賬號|賬號長度為:min到:max位"`
Pass string `p:"password1" v:"required|length:6,30#請輸入密碼|密碼長度不夠"`
Pass2 string `p:"password2" v:"required|length:6,30|same:password1#請確認(rèn)密碼|密碼長度不夠|兩次密碼不一致"`
}
// 注冊返回數(shù)據(jù)結(jié)構(gòu)
type RegisterRes struct {
Code int `json:"code"`
Error string `json:"error"`
Data interface{} `json:"data"`
}
func main() {
s := g.Server()
s.Group("/", func(group *ghttp.RouterGroup) {
group.ALL("/register", func(r *ghttp.Request) {
var req *RegisterReq
if err := r.Parse(&req); err != nil {
r.Response.WriteJsonExit(RegisterRes{
Code: 1,
Error: err.Error(),
})
}
// ...
r.Response.WriteJsonExit(RegisterRes{
Data: req,
})
})
})
s.SetPort(8199)
s.Run()
}在該示例中,我們定義了兩個結(jié)構(gòu)體:?RegisterReq?用于參數(shù)接收,?RegisterRes?用于數(shù)據(jù)返回。由于該接口返回的是?JSON?數(shù)據(jù)結(jié)構(gòu),可以看到,只有返回的結(jié)構(gòu)體中存在?json?標(biāo)簽,而接收的結(jié)構(gòu)體中只有?p?標(biāo)簽。因為?RegisterReq?僅用于參數(shù)接收,無需設(shè)置返回的?json?標(biāo)簽。
?p?標(biāo)簽是可選的,默認(rèn)情況下會通過 忽略特殊字符+不區(qū)分大小寫 的規(guī)則進(jìn)行屬性名稱匹配轉(zhuǎn)換,默認(rèn)匹配規(guī)則滿足絕大部分業(yè)務(wù)場景。
為了演示測試效果,這里在正常的返回結(jié)果?Data?屬性中將?RegisterReq?對象返回,由于該對象沒有綁定?json?標(biāo)簽,因此返回的?JSON?字段將會為其屬性名稱。
執(zhí)行后,我們通過?curl?工具來測試一下:
$ curl "http://127.0.0.1:8199/register?name=john&password1=123456&password2=123456"
{"code":0,"error":"","data":{"Name":"john","Pass":"123456","Pass2":"123456"}}
$ curl "http://127.0.0.1:8199/register?name=john&password1=123456&password2=12345"
{"code":1,"error":"密碼長度不夠; 兩次密碼不一致","data":null}
$ curl "http://127.0.0.1:8199/register"
{"code":1,"error":"請輸入賬號; 賬號長度為4到30位; 請輸入密碼; 密碼長度不夠; 請確認(rèn)密碼; 密碼長度不夠; 兩次密碼不一致","data":null}
示例2,校驗錯誤處理
可以看到在以上示例中,當(dāng)請求校驗錯誤時,所有校驗失敗的錯誤都返回了,這樣對于用戶體驗不是特別友好。當(dāng)產(chǎn)生錯誤時,我們可以將校驗錯誤轉(zhuǎn)換為?gvalid.Error?接口對象,隨后可以通過靈活的方法控制錯誤的返回。
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/util/gvalid"
)
type RegisterReq struct {
Name string `p:"username" v:"required|length:4,30#請輸入賬號|賬號長度為:min到:max位"`
Pass string `p:"password1" v:"required|length:6,30#請輸入密碼|密碼長度不夠"`
Pass2 string `p:"password2" v:"required|length:6,30|same:password1#請確認(rèn)密碼|密碼長度不夠|兩次密碼不一致"`
}
type RegisterRes struct {
Code int `json:"code"`
Error string `json:"error"`
Data interface{} `json:"data"`
}
func main() {
s := g.Server()
s.Group("/", func(group *ghttp.RouterGroup) {
group.ALL("/register", func(r *ghttp.Request) {
var req *RegisterReq
if err := r.Parse(&req); err != nil {
// Validation error.
if v, ok := err.(gvalid.Error); ok {
r.Response.WriteJsonExit(RegisterRes{
Code: 1,
Error: v.FirstString(),
})
}
// Other error.
r.Response.WriteJsonExit(RegisterRes{
Code: 1,
Error: err.Error(),
})
}
// ...
r.Response.WriteJsonExit(RegisterRes{
Data: req,
})
})
})
s.SetPort(8199)
s.Run()
}可以看到,當(dāng)錯誤產(chǎn)生后,我們可以通過?err.(gvalid.Error?)斷言的方式判斷錯誤是否為校驗錯誤,如果是的話則返回第一條校驗錯誤,而不是所有都返回。
此外,我們這里也可以使用?gerror.Current?獲取第一條報錯信息,而不是使用斷言判斷。例如:
var req *RegisterReq
if err := r.Parse(&req); err != nil {
r.Response.WriteJsonExit(RegisterRes{
Code: 1,
Error: gerror.Current(err).Error(),
})
}執(zhí)行后,我們通過?curl?工具來測試一下:
$ curl "http://127.0.0.1:8199/register"
{"code":1,"error":"請輸入賬號","data":null}
$ curl "http://127.0.0.1:8199/register?name=john&password1=123456&password2=12345"
{"code":1,"error":"兩次密碼不一致","data":null} 本文標(biāo)題:創(chuàng)新互聯(lián)GoFrame教程:GoFrame請求輸入-請求校驗
標(biāo)題URL:http://www.dlmjj.cn/article/copcdco.html


咨詢
建站咨詢
