Go 中的串流HTTP 回應:停用http.ResponseWriter 中的緩衝
串流式HTTP 回應允許將資料增量傳送至客戶端,而不是等待整個請求被處理。這種方法透過提供即時回饋並減少感知延遲來增強使用者體驗。在 Go 中,http.ResponseWriter 介面負責向客戶端發送回應。但是,預設情況下,它會緩衝資料直到請求完成。
解決方案:利用 Flusher 介面
要停用緩衝和流響應,我們可以利用 Flusher由某些 ResponseWriter 類型實現的介面。 Flusher 介面可讓我們手動將任何緩衝資料刷新到客戶端。
import ( "fmt" "log" "net/http" "time" ) func handle(res http.ResponseWriter, req *http.Request) { fmt.Fprintf(res, "sending first line of data") // Check if ResponseWriter implements Flusher interface if f, ok := res.(http.Flusher); ok { f.Flush() } else { log.Println("Damn, no flush") } time.Sleep(10 * time.Second) // Simulate a delay fmt.Fprintf(res, "sending second line of data") }
透過合併 Flusher 接口,我們可以在寫入每個回應區塊後明確刷新緩衝資料。這可確保資料立即傳送到客戶端,從而產生串流回應。
替代解決方案:劫持連線
另一種方法是劫持底層 TCP HTTP 請求的連線。這允許與套接字直接互動並自訂資料傳輸過程,包括停用緩衝。然而,這種方法比較複雜,需要對底層網路層有更深入的了解。
自動刷新:不是內建功能
不幸的是,Go 的 http.ResponseWriter不提供自動刷新功能。這意味著開發人員負責根據需要手動刷新資料。但是,某些框架或第三方程式庫可能提供自動刷新功能。
以上是如何在 Go 中實現串流 HTTP 回應並停用緩衝?的詳細內容。更多資訊請關注PHP中文網其他相關文章!