Ich benutze eine Bibliothek (Go-kit), die erfordert, dass ich Funktionen zum Codieren/Decodieren meiner Anfrage und Antworttypen zu/von JSON angeben. Für die Codierung ist es einfach:Golang JSON-Decodierung kann Schnittstelle nicht decodieren {}
Ich übergeben diese Funktion, um den HTTP-Server zu erstellen, und es funktioniert gut. Doch für Anfragen ihr vorgeschlagenen Ansatz ist eine separate Funktion der Form zu machen:
func decodeUppercaseRequest(_ context.Context, r *http.Request) (interface{}, error) {
var req UppercaseRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
return nil, err
}
return req, nil
}
Für jede einzelne RPC in meiner Anwendung. Ich würde meinen Code DRY gerne behalten und Hunderte von fast identischen Methoden vermeiden. Als solche habe ich versucht, eine Funktion zu schreiben Schließungen zu erzeugen, die die gegebene Anforderungstyp dekodieren:
func DecodeRequest(req interface{}) httptransport.DecodeRequestFunc {
return func(_ context.Context, r *http.Request) (interface{}, error) {
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
return nil, err
}
return req, nil
}
}
Diese Funktion kann wie so aufgerufen werden:
DecodeRequest(UppercaseRequest{}}
Leider, wenn ich so, die JSON Die Decodierung schlägt fehl, obwohl der Typ von req tatsächlich mypackage.UppercaseRequest ist. Ich bin mir nicht sicher, wohin ich von hier aus gehen soll. Kann ich es vermeiden, eine Methode pro Anfragetyp schreiben zu müssen? Gibt es eine Möglichkeit, wie ich der Decode-Funktion helfen kann zu verstehen, was dieser Typ zur Laufzeit ist? Danke im Voraus!
ist hier ein Spielplatz gehen das Problem demonstriert: https://play.golang.org/p/GgHsLffp1G
Was ist der json dekodieren errror? Ein Typ-Switch kann helfen oder das reflect-Paket verfügt über viele Tools zur Identifizierung des Laufzeittyps. – Sridhar
@Sridhar Wenn ich rufe DecodeRequest (CountRequest {}) bekomme ich "http: Panik dienen [:: 1]: 55992: Schnittstelle Umwandlung: Schnittstelle ist map [string] Schnittstelle {}, nicht user.CountRequest" und Wenn ich die zu verwendende Funktion ändere ... Decode (req) und DecodeRequest aufrufen (& CountRequest {}) bekomme ich "http: panic serving [:: 1]: 56375: schnittstellenumwandlung: interface is * user.CountRequest, not user.CountRequest " –
Was ist CountRequest? Eine Map [string] -Schnittstelle {}? Sie sollten sich wirklich an diese [http://www.stackoverflow.com/help/mcve] halten. Vielleicht versuchen Sie Decode (Req) und rufen Sie DecodeRequest (CountRequest {})? – Sridhar