In HTTP-Verarbeitungsimplementierungen ist die Überprüfung des Anforderungstexts für die Verarbeitung bestimmter Anforderungen, wie z. B. POST-Anfragen mit formularcodierten Daten, unerlässlich . Allerdings kann eine direkte Überprüfung mit Methoden wie req.ParseForm() den Anforderungsstatus stören und zu Fehlern bei der Weiterleitung der Anforderung an Reverse-Proxys führen.
Um dieses Problem zu beheben, ist es möglich, einen Blick auf den Anforderungstext zu werfen, ohne ihn zu verlassen jede Spur im ursprünglichen Anforderungsobjekt. Dadurch bleibt der ursprüngliche Zustand für nachfolgende Verbraucher wie Reverse-Proxys erhalten.
Ein effektiver Ansatz besteht darin, den Anforderungstext in einen Zwischenpuffer einzulesen und diesen Puffer zum Erstellen mehrerer Leser zu verwenden. Der folgende Codeausschnitt veranschaulicht dies:
// Read the request body into a buffer buf, _ := io.ReadAll(r.Body) // Create two readers from the buffer rdr1 := io.NopCloser(bytes.NewBuffer(buf)) rdr2 := io.NopCloser(bytes.NewBuffer(buf)) // Perform desired operations on the first reader doStuff(rdr1) // Reset the request body with the second reader r.Body = rdr2
In diesem Code erstellt bytes.NewBuffer(buf) Reader, die den gespeicherten Puffer umschließen. Der io.NopCloser stellt sicher, dass die Close()-Methode keinen Fehler zurückgibt, was für den Leser erforderlich ist, um die io.ReadCloser-Schnittstelle zu implementieren.
Das Code-Snippet ändert die Beispiel in der Frage, wobei doStuff() die Funktion ist, die den Anfragetext verarbeitet:
buf, _ := io.ReadAll(r.Body) rdr1 := io.NopCloser(bytes.NewBuffer(buf)) rdr2 := io.NopCloser(bytes.NewBuffer(buf)) doStuff(rdr1) r.Body = rdr2
Mit dieser Änderung der Anfragetext kann überprüft werden, ohne dass sich dies auf den ursprünglichen Anforderungsstatus auswirkt. Der Reverse-Proxy kann dann mit der Bearbeitung der Anfrage mit dem unveränderten Text fortfahren.
Das obige ist der detaillierte Inhalt vonWie kann ich einen HTTP-Anforderungstext überprüfen, ohne den Anforderungsstatus zu ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!