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 サイトの他の関連記事を参照してください。