http リクエストに golang を使用する場合、サーバーがチャンクエンコードされた応答を返す場合、応答本文を読み取るときにチャンクエンコードをオフにすることに注意する必要があります。そうしないと、不完全なデータが読み取られます。
チャンクエンコーディングは、データを複数のチャンクに分割して送信する伝送方式で、各チャンクにはデータのチャンクの長さが含まれます。すべてのブロックが送信された後、送信の終了を示すために長さ 0 のブロックが送信されます。
golang では、一般的に使用されるライブラリは、チャンク化されたエンコードされた http 応答もサポートしています。たとえば、標準ライブラリの http パッケージを使用してリクエストを送信する場合、サーバーがチャンクエンコードされた応答を返すと、応答本文が自動的に処理されて読み取られます。応答本文を読み取る必要があるだけです:
resp, err := http.Get("http://example.com") if err != nil { // handle error } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { // handle error }
ただし、場合によっては、チャンク エンコーディングを手動でオフにする必要があります。たとえば、応答本文の読み取り中にエラーが発生した場合、または応答本文の一部を読み取り、一時停止し、何らかの処理を実行してから読み取りを続行する必要があるとします。
チャンク エンコーディングを手動でオフにするには、net/http パッケージの TransferEncoding フィールドを使用します。リクエストまたはレスポンスの TransferEncoding フィールドに「chunked」が含まれている場合は、チャンク エンコーディングが使用されていることを意味します。 TransferEncoding フィールドを空に設定して、チャンク エンコーディングをオフにできます。
req, err := http.NewRequest(http.MethodGet, "http://example.com", nil) if err != nil { // handle error } resp, err := http.DefaultClient.Do(req) if err != nil { // handle error } defer resp.Body.Close() // check if the response is chunked if resp.TransferEncoding != nil && len(resp.TransferEncoding) > 0 && resp.TransferEncoding[0] == "chunked" { resp.TransferEncoding = nil } body, err := ioutil.ReadAll(resp.Body) if err != nil { // handle error }
上記のコードでは、最初に応答でチャンク エンコーディングが使用されているかどうかを確認します。その場合は、TransferEncoding フィールドを空に設定し、応答本文を読み取ります。
要約すると、チャンクエンコードされた http 応答を処理するときは、チャンクエンコードをオフにすることに注意する必要があります。チャンクエンコーディングは、TransferEncoding フィールドを使用して手動でオフにすることができます。
以上がgolangでチャンクエンコーディングをオフにする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。