Home >Backend Development >Golang >Problems with cross-domain custom verification in go
In Go language development, cross-domain requests are a common problem. Cross-domain requests refer to sending requests to servers under different domain names through JavaScript code in the browser. Due to browser origin policy restrictions, cross-domain requests are not allowed by default. However, in some scenarios, we may need to perform customized verification in cross-domain requests to ensure the security and accuracy of the request. In this article, PHP editor Xigua will introduce to you how to solve the problem of cross-domain custom verification in the Go language, helping you better cope with the challenges of cross-domain requests.
I'm trying to learn golang custom validation, but I'm having a lot of trouble. Here's the code I've been trying:
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) }
You can see the validation logic I tried in the code comments... If the DropShip
field is true, then I need to add Country
and Age
Submit to another API to see if the team member is eligible.
The problem is that I'm struggling to use the reflect
library to access the Country
and Age
fields in the TeamMember
structure. fmt.Println(c.(TeamMember))
Execute my program and it crashes.
Can someone give me an example of how to access other TeamMember fields? Or does my verification method violate the idiom of verification in golang?
In this case it is better to use custom structure level validation:
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 }
Also see the examples provided by the package: https://www.php.cn/link/fe41bb826b6a3cd35fe36744936400b9.
The above is the detailed content of Problems with cross-domain custom verification in go. For more information, please follow other related articles on the PHP Chinese website!