
在Go语言开发中,跨域请求是一个常见的问题。跨域请求是指在浏览器中,通过JavaScript代码向不同域名下的服务器发送请求。由于浏览器的同源策略限制,跨域请求默认是不被允许的。然而,在某些场景下,我们可能需要在跨域请求中进行自定义的验证,以确保请求的安全性和准确性。本文将由php小编西瓜为您介绍如何在Go语言中解决跨域自定义验证的问题,帮助您更好地应对跨域请求的挑战。
我正在尝试学习 golang 自定义验证,但遇到了很多麻烦。这是我一直在尝试的代码:
package main
import (
"reflect"
"github.com/go-playground/validator/v10"
"fmt"
)
type TeamMember struct {
Country string
Age int
DropShip bool `validate:"is_eligible"`
}
func CustomValidation(fl validator.FieldLevel) bool {
/*
if(DropShip == true) {
httpresponse = curl https://3rd-party-api.com/?country=<Country>&age=<Age>
return httpresponse.code == 200
}
return false
*/
b := fl.Parent()
fmt.Println(reflect.TypeOf(b))
fmt.Println(reflect.ValueOf(b))
c := reflect.ValueOf(b).Interface()
fmt.Println(c.(TeamMember))
fmt.Println("============")
return true
}
func main() {
var validate *validator.Validate
validate = validator.New(validator.WithRequiredStructEnabled())
_ = validate.RegisterValidation("is_eligible", CustomValidation)
teammember := TeamMember{"Canada", 34, true}
validate.Struct(teammember)
}您可以在代码注释中看到我尝试的验证逻辑...如果 DropShip 字段为 true,那么我需要将 Country 和 Age 提交到另一个 API,以查看该团队成员是否符合资格。
问题是我正在努力使用 reflect 库来访问 TeamMember 结构中的 Country 和 Age 字段。 fmt.Println(c.(TeamMember)) 行使我的程序崩溃。
有人能给我一个如何访问其他 TeamMember 字段的示例吗?或者我的验证方法是否违反了 golang 中验证的惯用方式?
newasp框架是一个基于 Classic Asp Vbscript Api 框架。全面支持64位,无需修改应用池32位启用,效率更高。 更新日志: 8月2号 - v2.2.9 修复Str.ToString对GetRows二维数组的解析问题 7月26号 - v2.2.8 修复IIS在前端自定义信息头提交下的跨域访问问题 修复路由对跨域OPTIONS发起提交导致的访问问题 修改web.confi
5
在这种情况下,最好使用自定义结构级别验证:
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
type TeamMember struct {
Country string
Age int
DropShip bool
}
func TeamMemberStructLevelValidation(sl validator.StructLevel) {
teamMember := sl.Current().Interface().(TeamMember)
if teamMember.DropShip {
// submit the Country and Age to another API to see if this team member is eligible.
if teamMember.Country == "Canada" && teamMember.Age == 34 {
sl.ReportError(teamMember.Country, "country", "Country", "is_eligible", "")
sl.ReportError(teamMember.Age, "age", "Age", "is_eligible", "")
}
}
}
func main() {
validate := validator.New(validator.WithRequiredStructEnabled())
validate.RegisterStructValidation(TeamMemberStructLevelValidation, TeamMember{})
teamMember := TeamMember{"Canada", 34, true}
err := validate.Struct(teamMember)
fmt.Printf("%+v\n", err)
// Output:
// Key: 'TeamMember.country' Error:Field validation for 'country' failed on the 'is_eligible' tag
// Key: 'TeamMember.age' Error:Field validation for 'age' failed on the 'is_eligible' tag
}
另请参阅包提供的示例:https://www.php.cn/link/fe41bb826b6a3cd35fe36744936400b9。
以上就是go中跨域自定义验证的问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号