Probleme mit der domänenübergreifenden benutzerdefinierten Überprüfung in Go

WBOY
Freigeben: 2024-02-11 23:18:09
nach vorne
939 Leute haben es durchsucht

Probleme mit der domänenübergreifenden benutzerdefinierten Überprüfung in Go

Bei der Go-Sprachentwicklung sind domänenübergreifende Anfragen ein häufiges Problem. Unter domänenübergreifenden Anfragen versteht man das Senden von Anfragen an Server unter verschiedenen Domänennamen über JavaScript-Code im Browser. Aufgrund von Richtlinienbeschränkungen für den Browserursprung sind domänenübergreifende Anfragen standardmäßig nicht zulässig. In einigen Szenarien müssen wir jedoch möglicherweise eine individuelle Überprüfung bei domänenübergreifenden Anfragen durchführen, um die Sicherheit und Genauigkeit der Anfrage zu gewährleisten. In diesem Artikel stellt Ihnen der PHP-Editor Xigua vor, wie Sie das Problem der domänenübergreifenden benutzerdefinierten Überprüfung in der Go-Sprache lösen und Ihnen dabei helfen, die Herausforderungen domänenübergreifender Anfragen besser zu bewältigen.

Frageninhalt

Ich versuche, die benutzerdefinierte Golang-Validierung zu lernen, habe aber große Probleme. Hier ist der Code, den ich ausprobiert habe:

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)
}
Nach dem Login kopieren

Sie können die Validierungslogik, die ich ausprobiert habe, in den Codekommentaren sehen ... wenn DropShip 字段为 true,那么我需要将 CountryAge an eine andere API übermittelt, um zu sehen, ob das Teammitglied berechtigt ist. < /p>

Das Problem ist, dass ich versuche, die reflect 库来访问 TeamMember 结构中的 CountryAge 字段。 fmt.Println(c.(TeamMember))-Übung durchzuführen und mein Programm abstürzt.

Kann mir jemand ein Beispiel geben, wie ich auf andere TeamMember-Felder zugreifen kann? Oder verstößt meine Verifizierungsmethode gegen die Verifizierungssprache in Golang?

Workaround

In diesem Fall ist es besser, die Validierung auf benutzerdefinierter Strukturebene zu verwenden:

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
}
Nach dem Login kopieren

Siehe auch das vom Paket bereitgestellte Beispiel: https://www.php.cn/link/fe41bb826b6a3cd35fe36744936400b9.

Das obige ist der detaillierte Inhalt vonProbleme mit der domänenübergreifenden benutzerdefinierten Überprüfung in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!