Heim > Backend-Entwicklung > Golang > Wie kann ich einen HTTP-Anfragetext in Go-Middleware-Handlern wiederverwenden?

Wie kann ich einen HTTP-Anfragetext in Go-Middleware-Handlern wiederverwenden?

Susan Sarandon
Freigeben: 2024-12-05 11:19:10
Original
355 Leute haben es durchsucht

How Can I Reuse an HTTP Request Body in Go Middleware Handlers?

Wiederverwendung des HTTP-Anforderungstexts in Go-Middleware-Handlern

Im Net/http-Paket von Go bieten Middleware-Handler eine bequeme Möglichkeit, eingehende Daten zu verarbeiten und zu ändern HTTP-Anfragen vor der Verarbeitung durch den eigentlichen Anwendungscode. Eine häufige Herausforderung entsteht jedoch, wenn ein Middleware-Handler den Anforderungstext wiederverwenden muss, der bereits von einem vorhergehenden Handler gelesen wurde.

Bedenken Sie den folgenden Codeausschnitt:

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

In diesem Szenario , liest der Registrierungshandler den Anforderungstext in die Variable b und übergibt die Anforderung r an den user.Create-Handler, der versucht, den Text erneut zu lesen. Dies führt jedoch zu einem Fehler, da der Hauptteil bereits vom Registrierungshandler verbraucht wurde.

Die Lösung für dieses Problem ist einfach: Stellen Sie den Anforderungshauptteil im äußeren Handler wieder her, nachdem er gelesen wurde. Dies kann mit den Funktionen bytes.NewReader() und io.NopCloser 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)
}
Nach dem Login kopieren

Die Funktion bytes.NewReader() erstellt einen io.Reader aus einem Byte-Slice und io.NopCloser konvertiert einen io .Reader auf den erforderlichen io.ReadCloser-Typ für r.Body. Durch die Wiederherstellung des Hauptteils können nachfolgende Handler auf die ursprünglichen Anforderungsdaten zugreifen.

Das obige ist der detaillierte Inhalt vonWie kann ich einen HTTP-Anfragetext in Go-Middleware-Handlern wiederverwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage