Maison > développement back-end > Golang > le corps du texte

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

WBOY
Libérer: 2024-02-11 23:18:09
avant
939 Les gens l'ont consulté

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)
}
Copier après la connexion

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. < /p>

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
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!