Lassen Sie uns sagen, dass ich die folgende Go Struktur auf dem ServerWie kann man dem Client mitteilen, dass er eine Ganzzahl anstelle einer Zeichenfolge von einem Go-Server senden muss?
type account struct {
Name string
Balance int
}
Ich möchte json.Decode auf der eingehenden Anfrage nennen es auf ein Konto zu analysieren.
var ac account
err := json.NewDecoder(r.Body).Decode(&ac)
Wenn der Client sendet die folgende Anfrage:
{
"name": "[email protected]",
"balance": "3"
}
Decode() wird die folgende Fehlermeldung zurück:
json: cannot unmarshal string into Go value of type int
Jetzt ist es möglich in „Sie, dass zurück zu analysieren hat eine Zeichenfolge für Balance gesendet, aber Sie hätten eigentlich eine Ganzzahl senden sollen ", aber es ist schwierig, weil Sie den Feldnamen nicht kennen. Es wird auch viel schwieriger, wenn Sie viele Felder in der Anfrage haben - Sie wissen nicht, welche nicht analysiert wurde.
Was ist die beste Methode, um diese eingehende Anforderung in Go zu übernehmen und die Fehlermeldung "Balance muss eine Zeichenfolge sein" für eine beliebige Anzahl von Ganzzahlfeldern in einer Anforderung zurückzugeben?
Ich denke, Sie so etwas wie dekodieren auf eine generische Struktur voll von Schnittstellen und Nutzungsart Behauptung tun könnte, um zu sehen, ob alle int Felder wie Ints aussehen . –
Es gibt ein offenes Problem, um mehr Informationen aus Dekodierfehlern zu erhalten, aber es ist nicht trivial und würde nicht vor mindestens go1.7 passieren. Können Sie einfach json.Unmarshaler implementieren und die Felder validieren? – JimB
Letztendlich: Wenn der Client eine ungültige Anforderung sendet, sollten Sie eine 400 Bad Request-Nachricht zurückgeben und Ihre API-Dokumentation zur Verfügung stellen, damit sie wissen, wie es falsch ist. –