Wiederverwendung von HTTP-Anforderungskörpern in Go-Chi-Middleware-Handlern
In Go kann es bei Verwendung des Go-Chi-HTTP-Routers zu einer Situation kommen Dabei müssen Sie den Anforderungstext in mehreren Middleware-Handlern wiederverwenden. Der folgende Codeausschnitt veranschaulicht ein Szenario, in dem dieses Problem auftritt:
func Registration(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // if you delete this line, the user will be created // ...other code // if all good then create new user user.Create(w, r) } ... func Create(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // ...other code // ... there I get the problem with parse JSON from &b }
Der Registrierungshandler versucht, den Anforderungstext zu lesen und zu verarbeiten. Nach diesem Schritt schlägt jedoch beim Aufruf des Create-Handlers das Parsen von JSON aus dem Anforderungstext fehl, da dieser leer ist. Dies geschieht, weil der äußere Handler den Anforderungstext bis zum Ende liest, sodass für den inneren Handler nichts zum Lesen übrig bleibt.
Um dieses Problem zu beheben, muss der Anforderungstext wiederhergestellt werden, indem die zuvor im äußeren Handler gelesenen Daten wiederhergestellt werden . Der folgende Codeausschnitt zeigt, wie dies erreicht wird:
func Registration(w http.ResponseWriter, r *http.Request) { b, err := io.ReadAll(r.Body) // ...other code r.Body = io.NopCloser(bytes.NewReader(b)) user.Create(w, r) }
In diesem Code gibt die Funktion bytes.NewReader einen io.Reader für ein Byte-Slice zurück. Die Funktion io.NopCloser wiederum konvertiert den io.Reader in den erforderlichen io.ReadCloser für r.Body. Durch die Wiederherstellung des Anforderungstexts können nachfolgende Handler wie erwartet auf dessen Inhalt zugreifen und ihn verarbeiten.
Das obige ist der detaillierte Inhalt vonWie kann man HTTP-Anforderungskörper in Go-Chi-Middleware-Handlern wiederverwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!