When using golang for http requests, if the server returns a chunked-encoded response, you need to pay attention to turning off chunked encoding when reading the response body, otherwise incomplete data will be read.
Chunked encoding is a transmission method that divides data into multiple chunks and sends them. Each chunk contains the length of the chunk of data. After all blocks have been transmitted, a block of length 0 is sent to indicate the end of the transmission.
In golang, commonly used libraries also support chunked encoded http responses. For example, when sending a request using the http package of the standard library, if the server returns a chunked-encoded response, the response body will be automatically processed and read. We only need to read the response body:
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 }
However, in some cases, chunked encoding needs to be turned off manually. For example, an error is encountered when reading the response body, or it is necessary to read part of the response body, pause, perform some processing, and then continue reading.
In order to manually turn off chunked encoding, we can use the TransferEncoding field in the net/http package. When the TransferEncoding field in the request or response contains "chunked", it means that chunked encoding is used. We can set the TransferEncoding field to empty to turn off chunked encoding:
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 }
In the above code, we first check whether the response uses chunked encoding. If so, set the TransferEncoding field to empty and then read the response body.
To summarize, when processing chunked encoded http responses, you need to pay attention to turning off chunked encoding. Chunked encoding can be turned off manually using the TransferEncoding field.
The above is the detailed content of How to turn off chunked encoding in golang. For more information, please follow other related articles on the PHP Chinese website!