日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)GoFrame教程:GoFrame請(qǐng)求輸入-請(qǐng)求校驗(yàn)

?Request?對(duì)象支持非常完美的請(qǐng)求校驗(yàn)?zāi)芰?,通過(guò)給結(jié)構(gòu)體屬性綁定?v?標(biāo)簽即可。

10年專注成都網(wǎng)站制作,成都企業(yè)網(wǎng)站定制,個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都企業(yè)網(wǎng)站定制,高端網(wǎng)頁(yè)制作,對(duì)LED顯示屏等多個(gè)方面,擁有多年的網(wǎng)站運(yùn)維經(jīng)驗(yàn)。

需要注意的是,從?GOframe v1.16?版本開始,如果參數(shù)采用結(jié)構(gòu)化的輸入輸出管理,?HTTP?請(qǐng)求的數(shù)據(jù)校驗(yàn)不再受結(jié)構(gòu)體默認(rèn)值的影響,底層調(diào)用的是?gvalid?組件的?CheckStructWithData?方法,即直接使用請(qǐng)求的參數(shù)執(zhí)行數(shù)據(jù)校驗(yàn),而給定的結(jié)構(gòu)體對(duì)象僅用于校驗(yàn)規(guī)則和錯(cuò)誤提示信息的定義管理。

示例1,基本使用

我們將之前的示例做下調(diào)整,增加?v?校驗(yàn)標(biāo)簽。

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

// 注冊(cè)請(qǐng)求數(shù)據(jù)結(jié)構(gòu)
type RegisterReq struct {
	Name  string `p:"username"  v:"required|length:4,30#請(qǐng)輸入賬號(hào)|賬號(hào)長(zhǎng)度為:min到:max位"`
	Pass  string `p:"password1" v:"required|length:6,30#請(qǐng)輸入密碼|密碼長(zhǎng)度不夠"`
	Pass2 string `p:"password2" v:"required|length:6,30|same:password1#請(qǐng)確認(rèn)密碼|密碼長(zhǎng)度不夠|兩次密碼不一致"`
}

// 注冊(cè)返回?cái)?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()
}

在該示例中,我們定義了兩個(gè)結(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)簽。因?yàn)?RegisterReq?僅用于參數(shù)接收,無(wú)需設(shè)置返回的?json?標(biāo)簽。

?p?標(biāo)簽是可選的,默認(rèn)情況下會(huì)通過(guò) 忽略特殊字符+不區(qū)分大小寫 的規(guī)則進(jìn)行屬性名稱匹配轉(zhuǎn)換,默認(rèn)匹配規(guī)則滿足絕大部分業(yè)務(wù)場(chǎng)景。

為了演示測(cè)試效果,這里在正常的返回結(jié)果?Data?屬性中將?RegisterReq?對(duì)象返回,由于該對(duì)象沒(méi)有綁定?json?標(biāo)簽,因此返回的?JSON?字段將會(huì)為其屬性名稱。

執(zhí)行后,我們通過(guò)?curl?工具來(lái)測(cè)試一下:

$ 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":"密碼長(zhǎng)度不夠; 兩次密碼不一致","data":null}

$ curl "http://127.0.0.1:8199/register"
{"code":1,"error":"請(qǐng)輸入賬號(hào); 賬號(hào)長(zhǎng)度為4到30位; 請(qǐng)輸入密碼; 密碼長(zhǎng)度不夠; 請(qǐng)確認(rèn)密碼; 密碼長(zhǎng)度不夠; 兩次密碼不一致","data":null}

示例2,校驗(yàn)錯(cuò)誤處理

可以看到在以上示例中,當(dāng)請(qǐng)求校驗(yàn)錯(cuò)誤時(shí),所有校驗(yàn)失敗的錯(cuò)誤都返回了,這樣對(duì)于用戶體驗(yàn)不是特別友好。當(dāng)產(chǎn)生錯(cuò)誤時(shí),我們可以將校驗(yàn)錯(cuò)誤轉(zhuǎn)換為?gvalid.Error?接口對(duì)象,隨后可以通過(guò)靈活的方法控制錯(cuò)誤的返回。

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#請(qǐng)輸入賬號(hào)|賬號(hào)長(zhǎng)度為:min到:max位"`
	Pass  string `p:"password1" v:"required|length:6,30#請(qǐng)輸入密碼|密碼長(zhǎng)度不夠"`
	Pass2 string `p:"password2" v:"required|length:6,30|same:password1#請(qǐng)確認(rèn)密碼|密碼長(zhǎng)度不夠|兩次密碼不一致"`
}

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)錯(cuò)誤產(chǎn)生后,我們可以通過(guò)?err.(gvalid.Error?)斷言的方式判斷錯(cuò)誤是否為校驗(yàn)錯(cuò)誤,如果是的話則返回第一條校驗(yàn)錯(cuò)誤,而不是所有都返回。

此外,我們這里也可以使用?gerror.Current?獲取第一條報(bào)錯(cuò)信息,而不是使用斷言判斷。例如:

var req *RegisterReq
if err := r.Parse(&req); err != nil {
	r.Response.WriteJsonExit(RegisterRes{
		Code:  1,
		Error: gerror.Current(err).Error(),
	})
}

執(zhí)行后,我們通過(guò)?curl?工具來(lái)測(cè)試一下:

$ curl "http://127.0.0.1:8199/register"
{"code":1,"error":"請(qǐng)輸入賬號(hào)","data":null}

$ curl "http://127.0.0.1:8199/register?name=john&password1=123456&password2=12345"
{"code":1,"error":"兩次密碼不一致","data":null}

本文名稱:創(chuàng)新互聯(lián)GoFrame教程:GoFrame請(qǐng)求輸入-請(qǐng)求校驗(yàn)
文章URL:http://m.5511xx.com/article/copcdco.html