ホームページ >バックエンド開発 >Golang >Go でチャンク化された HTTP 応答を段階的にストリーミングする方法は?

Go でチャンク化された HTTP 応答を段階的にストリーミングする方法は?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-10 01:26:12218ブラウズ

How to Stream Chunked HTTP Responses Incrementally in Go?

Go でのチャンク化された HTTP 応答のストリーミング

問題ステートメント:

Go HTTP の実装時チャンク化された応答を送信するサーバーでは、サーバーは最後にすべてのチャンクを一貫して配信します。段階的に送信するのではなく、指定された期間の送信を行います。さらに、Go は、コンテンツが事前に不明な場合でも、0 より大きい値を持つ Content-Length ヘッダーを自動的に組み込みます。

解決策:

インクリメンタルを有効にするにはチャンクを送信し、Content-Length ヘッダーを時期尚早に設定しないようにするには、次に従ってください。手順:

  1. Transfer-Encoding ヘッダーの削除: Go は、ライターがチャンク化された応答を送信するときに、 Transfer-Encoding ヘッダーを自動的に処理します。したがって、明示的に設定する必要はありません。
  2. Embrace Flush: 各チャンクを応答ストリームに書き込んだ直後にフラッシュするには、http.ResponseWriter.Flush() を使用します。これにより、チャンク エンコーディングがトリガーされ、応答の完了を待たずにチャンクが送信されます。

コード例:

package main

import (
    "fmt"
    "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()
            time.Sleep(500 * time.Millisecond)
        }
    })

    log.Print("Listening on localhost:8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

検証:

Telnet を使用してサーバーをテストすると、チャンクが送信されていることが表示されます段階的に:

$ telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1

HTTP/1.1 200 OK
Date: Tue, 02 Jun 2015 18:16:38 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked

9
Chunk #1

9
Chunk #2

...

以上がGo でチャンク化された HTTP 応答を段階的にストリーミングする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。