ホームページ > バックエンド開発 > Golang > Go でストリーミング HTTP 応答を実現し、バッファリングを無効にする方法

Go でストリーミング HTTP 応答を実現し、バッファリングを無効にする方法

DDD
リリース: 2024-12-24 02:58:10
オリジナル
295 人が閲覧しました

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

Go での HTTP 応答のストリーミング: http.ResponseWriter でのバッファリングの無効化

HTTP 応答のストリーミングにより、データを段階的にクライアントに送信できます。リクエスト全体が処理されるのを待つのではなく、このアプローチは、フィードバックを即時に提供し、体感的な待ち時間を短縮することでユーザー エクスペリエンスを向上させます。 Go では、http.ResponseWriter インターフェイスがクライアントに応答を送信する役割を果たします。ただし、デフォルトでは、リクエストが完了するまでデータをバッファリングします。

解決策: フラッシャー インターフェイスを利用する

バッファリングを無効にして応答をストリームするには、フラッシャーを利用できます。一部の 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート