首頁 >後端開發 >Golang >如何在 Go 中實現串流 HTTP 回應並停用緩衝?

如何在 Go 中實現串流 HTTP 回應並停用緩衝?

DDD
DDD原創
2024-12-24 02:58:10301瀏覽

How to Achieve Streaming HTTP Responses and Disable Buffering in Go?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn