首頁 > 後端開發 > Golang > 為什麼我的 Go HTTP 伺服器不逐步發送分塊回應?

為什麼我的 Go HTTP 伺服器不逐步發送分塊回應?

DDD
發布: 2024-12-09 09:21:09
原創
163 人瀏覽過

Why Doesn't My Go HTTP Server Send Chunked Responses Progressively?

來自Go 伺服器的HTTP 區塊回應

在這個場景中,我們的目標是建立一個Go HTTP 伺服器,它會傳送一個分區塊的HTTP 回應傳輸編碼設定為「分塊」。伺服器打算以一秒的間隔寫入區塊,從而允許客戶端按需接收它們。然而,目前的實作面臨挑戰:

  1. 客戶端一次接收所有區塊,而不是按預期逐步接收。
  2. Content-Length 標頭由 Go 自動設置,我們想要為 0 並添加到最後。

服務器代碼

提供的服務器代碼如下:

func HandlePost(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Connection", "Keep-Alive")
    w.Header().Set("Transfer-Encoding", "chunked")
    w.Header().Set("X-Content-Type-Options", "nosniff")

    ticker := time.NewTicker(time.Second)
    go func() {
        for t := range ticker.C {
            io.WriteString(w, "Chunk")
            fmt.Println("Tick at", t)
        }
    }()
    time.Sleep(time.Second * 5)
    ticker.Stop()
    fmt.Println("Finished: should return Content-Length: 0 here")
    w.Header().Set("Content-Length", "0")
}
登入後複製

解決方案

解決問題:

  1. http.ResponseWriter實作的「Flusher」介面允許我們透過呼叫Flush() 函式。透過在寫入每個區塊後新增此內容,客戶端可以在準備好時接收區塊。
  2. Transfer-Encoding 標頭由 HTTP 編寫器自動管理,因此不需要明確設定它。

已修訂程式碼

import (
  "fmt"
  "io"
  "log"
  "net/http"
  "time"
)

func main() {
  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    flusher, ok := w.(http.Flusher)
    if !ok {
      panic("expected http.ResponseWriter to be an http.Flusher")
    }
    w.Header().Set("X-Content-Type-Options", "nosniff")
    for i := 1; i <= 10; i++ {
      fmt.Fprintf(w, "Chunk #%d\n", i)
      flusher.Flush() // Trigger "chunked" encoding and send a chunk...
      time.Sleep(500 * time.Millisecond)
    }
  })

  log.Print("Listening on localhost:8080")
  log.Fatal(http.ListenAndServe(":8080", nil))
}
登入後複製

驗證

使用telnet連接到伺服器:

$ telnet localhost 8080
...
HTTP/1.1 200 OK
Date: ...
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked

9
Chunk #1

9
Chunk #2

...
登入後複製

使用telnet連接到伺服器:

使用telnet連接到伺服器:使用telnet連接到伺服器:使用telnet連接到伺服器:使用telnet連接到伺服器:使用telnet連接到伺服器:使用telnet連接到伺服器:每個區塊將逐步接收為伺服器發送它們。

以上是為什麼我的 Go HTTP 伺服器不逐步發送分塊回應?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板