ist resp.Body.Close () notwendig, wenn wir nichts vom Körper lesen?

8

Ich habe eine Funktion, die nur eine get-Anfrage macht, um den Statuscode zu überprüfen. Es liest nichts vom Körper. Soll ich die Funktion noch mit resp.Body.Close() beenden?

  

Anrufer sollten resp. Body schließen, wenn sie es lesen. Wenn resp.Body nicht geschlossen ist, kann der zugrunde liegende RoundTripper des Clients (normalerweise Transport) möglicherweise keine dauerhafte TCP-Verbindung zum Server für eine nachfolgende "Keep-Alive" -Anforderung erneut verwenden.

    
Oguz Bilgic 03.09.2013, 18:06
quelle

1 Antwort

15

Ja. Wenn Sie http.Get aufrufen, gibt die Funktion eine Antwort zurück, sobald alle HTTP-Header gelesen wurden. Der Hauptteil der Antwort wurde noch nicht gelesen. Das Response.Body ist ein Wrapper um die Netzwerkverbindung zum Server. Wenn Sie davon lesen, lädt es den Hauptteil der Antwort herunter.

.Close () teilt dem System mit, dass Sie mit der Netzwerkverbindung fertig sind. Wenn Sie den Antworttext nicht gelesen haben, schließt der Standard-HTTP-Transport die Verbindung. (Der Transport kann die Verbindung nur dann wiederverwenden, wenn der Text gelesen wurde, denn wenn er eine Verbindung mit einem ungelesenen Text erneut verwendet, erhält die nächste Anfrage, die über diese Verbindung erfolgt, die Antwort der vorherigen Anfrage!)

Das Lesen des Body ist also häufig effizienter als einfach Schließen (), wenn Sie mehr als eine Anfrage stellen - besonders mit TLS-Verbindungen, deren Erstellung relativ aufwendig ist.

Wenn Sie den Hauptteil der Antwort nicht benötigen, sollten Sie Head anstelle von Get verwenden. Head muss nicht oder lesen, um den Antworttext zu schließen.

    
andybalholm 03.09.2013, 21:14
quelle

Tags und Links