Wiederverwendung des HTTP-Anforderungstexts in Go-chi-Middleware-Handlern
Bei der Verwendung von go-chi für HTTP-Routing ist es praktisch, Code in mehreren wiederzuverwenden Handler. Dies kann jedoch zu unerwarteten Problemen führen, wenn die Handler auf Anforderungstextdaten angewiesen sind.
Stellen Sie sich das folgende Szenario vor:
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 }
In diesem Beispiel versuchen sowohl der Registration- als auch der Create-Handler zu lesen den Anforderungstext mit ioutil.ReadAll. Da die Registrierung den Hauptteil jedoch bis zum Ende liest, sind beim Aufruf von „Erstellen“ keine Daten mehr zum Lesen übrig.
Um dieses Problem zu beheben, muss der äußere Handler (Registrierung) den Anforderungshauptteil mit den zuvor gelesenen Daten wiederherstellen. Dies kann mit dem folgenden Code erreicht werden:
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) }
Hier gibt die Funktion bytes.NewReader() einen io.Reader auf einem Byte-Slice zurück, während die Funktion io.NopCloser diesen Reader in den io umwandelt. ReadCloser-Schnittstelle für r.Body erforderlich. Durch das Zurücksetzen von r.Body mit den Originaldaten kann Create nun wie erwartet auf den Anfragetext zugreifen und ihn analysieren.
Das obige ist der detaillierte Inhalt vonWie kann man HTTP-Anforderungskörperdaten über Go-chi-Middleware-Handler hinweg wiederverwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!