Heim >Backend-Entwicklung >Golang >Wie kann ich eine HTTP-Anfrage mit langem Polling in Go abbrechen?
Abbrechen einer Long-Polling-Anfrage in Golang
Bei der Implementierung einer clientseitigen Long-Polling-Anfrage mit http.Client ist dies oft wünschenswert um die Möglichkeit zu haben, die Anfrage vorzeitig abzubrechen. Dies könnte durch den manuellen Aufruf von resp.Body.Close() aus einer separaten Goroutine erreicht werden, ist aber keine standardmäßige und elegante Lösung.
Stornierung mithilfe des Anforderungskontexts
Eine idiomatischere Möglichkeit, eine HTTP-Anfrage in Golang abzubrechen, ist die Verwendung des Anfragekontexts. Durch die Übergabe eines Kontexts mit einer Frist oder einer Abbruchfunktion kann die Anfrage von der Client-Seite abgebrochen werden. Der folgende Code zeigt, wie der Anforderungskontext zum Abbrechen einer langen Abfrageanforderung verwendet wird:
import ( "context" "net/http" ) func main() { // Create a new HTTP client with a custom transport. client := &http.Client{ Transport: &http.Transport{ // Set a timeout for the request. Dial: (&net.Dialer{Timeout: 5 * time.Second}).Dial, TLSHandshakeTimeout: 5 * time.Second, }, } // Create a new request with a context that can be cancelled. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) req, err := http.NewRequest("POST", "http://example.com", nil) if err != nil { panic(err) } req = req.WithContext(ctx) // Start the request in a goroutine and cancel it after 5 seconds. go func() { _, err := client.Do(req) if err != nil { // Handle the canceled error. } }() time.Sleep(5 * time.Second) cancel() }
Wenn die Funktion cancel() aufgerufen wird, wird die Anforderung abgebrochen und die im Transport angegebenen Dial- und TLSHandshakeTimeout-Werte werden festgelegt wird respektiert.
Das obige ist der detaillierte Inhalt vonWie kann ich eine HTTP-Anfrage mit langem Polling in Go abbrechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!