Heim > Backend-Entwicklung > Golang > Wie kann ich einen HTTP-Anfragetext überprüfen, ohne Daten für nachfolgende Handler zu verlieren?

Wie kann ich einen HTTP-Anfragetext überprüfen, ohne Daten für nachfolgende Handler zu verlieren?

Linda Hamilton
Freigeben: 2024-12-25 01:27:14
Original
480 Leute haben es durchsucht

How Can I Inspect an HTTP Request Body Without Losing Data for Subsequent Handlers?

Beibehalten des Anforderungsstatus beim Überprüfen des Hauptteils mit HTTP.Handler

Im Zusammenhang mit der Implementierung eines HTTP-Handlers wird der Zugriff auf den Anforderungshauptteil mithilfe von Methoden wie req.ParseForm() kann ein Dilemma schaffen. Obwohl eine solche Überprüfung oft notwendig ist, kann sie den Body-Stream der Anfrage erschöpfen und ihn für nachfolgende Handler (z. B. Reverse-Proxys) unbrauchbar machen.

Das Problem: Entleerter Body-Stream

Wenn der Anforderungstext durch Aufrufen von Methoden wie req.ParseForm() verbraucht wird, wird der req.Body.Reader-Stream geleert, sodass keine verbleibenden Daten für den Downstream übrig bleiben Handler. Dies führt zu Fehlern bei der Proxy-Weiterleitung, da die erwartete Länge des Anforderungstexts nicht mehr mit dem erschöpften Zustand übereinstimmt.

Die Lösung: Teilen Sie den Body Stream auf

Um diese Herausforderung zu meistern kann eine Technik mit einer Pufferschicht eingesetzt werden. Indem wir den Anforderungstext in einen Puffer einlesen und diesen Puffer verwenden, um mehrere neue Leser zu erstellen, können wir die Inspektion vom ursprünglichen Textstrom trennen.

Schritte:

  1. Lesen Sie den ursprünglichen Anforderungstext mit io.ReadAll(r.Body) in einen Puffer.
  2. Erstellen Sie zwei neue Reader aus dem Puffer.
  3. Verwenden Sie einen neuen Leser, um eine Körperinspektion durchzuführen (z. B. doStuff(rdr1)).
  4. Weisen Sie den zweiten neuen Leser r.Body zu und bewahren Sie den ursprünglichen Zustand für spätere Zwecke auf Handler.

Beispiel:

buf, _ := io.ReadAll(r.Body)
rdr1 := io.NopCloser(bytes.NewBuffer(buf))
rdr2 := io.NopCloser(bytes.NewBuffer(buf))

doStuff(rdr1)
r.Body = rdr2
Nach dem Login kopieren

Vorteile:

  1. Bewahrt die Anfrage Status: Der ursprüngliche req.Body bleibt für spätere Zwecke erhalten Handler.
  2. Unterstützt Body Parsing: Inspektionsmethoden wie req.ParseForm() können auf dem separaten Reader verwendet werden, ohne den Anforderungsstatus zu beeinflussen.
  3. Unterstützt Custom Körperverarbeitung: Das separate Lesegerät ermöglicht eine individuelle Körperverarbeitung, ohne die nachgelagerten Vorgänge zu beeinträchtigen.

Das obige ist der detaillierte Inhalt vonWie kann ich einen HTTP-Anfragetext überprüfen, ohne Daten für nachfolgende Handler zu verlieren?. 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