Maison  >  Article  >  développement back-end  >  Problèmes avec la vérification personnalisée inter-domaines en Go

Problèmes avec la vérification personnalisée inter-domaines en Go

WBOY
WBOYavant
2024-02-11 23:18:09940parcourir

Problèmes avec la vérification personnalisée inter-domaines en Go

Dans le développement du langage Go, les requêtes inter-domaines sont un problème courant. Les requêtes inter-domaines font référence à l'envoi de requêtes à des serveurs sous différents noms de domaine via le code JavaScript dans le navigateur. En raison des restrictions de la politique d'origine du navigateur, les requêtes inter-domaines ne sont pas autorisées par défaut. Cependant, dans certains scénarios, nous pouvons être amenés à effectuer une vérification personnalisée dans les requêtes inter-domaines afin de garantir la sécurité et l'exactitude de la requête. Dans cet article, l'éditeur PHP Xigua vous présentera comment résoudre le problème de la vérification personnalisée inter-domaines dans le langage Go, vous aidant ainsi à mieux faire face aux défis des requêtes inter-domaines.

Contenu de la question

J'essaie d'apprendre la validation personnalisée Golang, mais j'ai beaucoup de problèmes. Voici le code que j'ai essayé :

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)
}

Vous pouvez voir la logique de validation que j'ai essayée dans les commentaires du code... si DropShip 字段为 true,那么我需要将 CountryAge se soumet à une autre API pour voir si le membre de l'équipe est éligible.

Le problème est que j'essaie d'utiliser l'exercice reflect 库来访问 TeamMember 结构中的 CountryAge 字段。 fmt.Println(c.(TeamMember)) et mon programme plante.

Quelqu'un peut-il me donner un exemple de la façon d'accéder aux autres champs TeamMember ? Ou ma méthode de vérification viole-t-elle l'idiome de vérification en golang ?

Solution de contournement

Dans ce cas, il est préférable d'utiliser une validation au niveau de la structure personnalisée :

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
}

Voir aussi l'exemple fourni par le package : https://www.php.cn/link/fe41bb826b6a3cd35fe36744936400b9.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer