最近の Web アプリケーションでは、Ajax テクノロジを使用して HTTP リクエストをサーバーに送信することが非常に一般的です。ただし、大量のデータを転送する必要がある場合、すべてのデータを一度に送信することは良い選択肢ではありません。現時点では、チャンク リクエストはデータをチャンクでサーバーに送信し、ネットワーク帯域幅の使用量を削減するのに役立ちます。この記事では、Golang を使用してチャンク リクエストを実装するプロセスについて説明します。
チャンクリクエストとは何ですか?
HTTP リクエストの処理中、通常の状況では、クライアントはすべてのリクエスト データを一度にサーバーに送信し、サーバーはそれを処理して応答結果を返します。ただし、大量のデータを送信する必要がある場合、この方法ではネットワーク速度が遅くなったり、サーバーのリソース条件を満たせなくなったりします。
したがって、チャンク リクエスト (ストリーミング リクエストとも呼ばれます) は、大きなデータをいくつかの小さなチャンクに分割し、それらをサーバーに複数回送信することです。サーバーはブロックを受信すると、すべてのデータが送信されるのを待ってから処理するのではなく、すぐにブロックの処理を開始します。このように、チャンク リクエストにより、データ送信の効率とサーバー リソースの使用率を同時に向上させることができます。
Golang を使用してチャンク リクエストを実装する
Golang を使用してチャンク リクエストを実装するのは非常に簡単です。
1. リクエストを複数のチャンクに分割する
定義したサイズに従ってリクエスト データを複数のチャンクに分割し、io.Copy を使用します。 ( ) 関数はチャンクを http.Request に書き込みます。以下は、リクエスト データを 1kb のサイズに応じて複数のチャンクに分割するサンプル コードです:
package main import ( "bytes" "io" "io/ioutil" "net/http" ) func main() { // 定义一段请求数据 payload := []byte("这是一段非常长的请求数据,我们需要将它分成多个chunk发送到服务器端。") // 定义chunk大小 chunkSize := 1024 // 将payload分成多个chunk,每个chunk的大小为1kb reader := bytes.NewReader(payload) buf := make([]byte, chunkSize) for { n, err := reader.Read(buf) if err == io.EOF { break } // 将每个chunk写入到http.request的body中 req, _ := http.NewRequest(http.MethodPost, "http://localhost:8080", bytes.NewReader(buf[:n])) _, _ = http.DefaultClient.Do(req) } }
2. サーバー側ですべてのチャンクをマージします
サーバー側では、受信する 受信した複数のチャンクがマージされます。最後のチャンクが読み取られると、完全なリクエスト データが利用可能になります。分割されたチャンクを完全なリクエスト データに再構築するサンプル コードを次に示します。
package main import ( "io/ioutil" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // 读取请求数据 bytes, _ := ioutil.ReadAll(r.Body) // 处理请求数据 _ = processData(bytes) }) _ = http.ListenAndServe(":8080", nil) } func processData(data []byte) error { // 处理请求数据 _ = doSomething(data) // 返回结果 return nil }
結論
チャンク リクエストは、データ送信の効率を大幅に向上させ、サーバー リソースの占有を削減するための非常に効率的な方法です。 。 Golang を使用してチャンク リクエストを実装するのは非常に簡単で、リクエストを複数の小さなチャンクに分割し、これらの小さなチャンクを http.Request に書き込むだけです。同時に、サーバー側では、すべてのチャンクを完全なリクエスト データにマージする必要があります。
以上がチャンクリクエスト golangの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。