Go サーバーからの HTTP チャンク応答
このシナリオでは、チャンク化された HTTP 応答を送信する Go HTTP サーバーを作成することを目的としています。 Transfer-Encoding が「chunked」に設定されています。サーバーは 1 秒間隔でチャンクを書き込み、クライアントがオンデマンドでチャンクを受信できるようにする予定です。ただし、現在の実装は課題に直面しています。
サーバーコード
提供されるサーバー コードは次のとおりです:
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") }
解決策
問題を解決するには:
改訂コード
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 ...
各チャンクは次のように段階的に受信されます。サーバーがそれらを送信します。
以上がGo HTTP サーバーが分割された応答を段階的に送信しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。