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 필드에 "청크"가 포함되어 있으면 청크 분할 인코딩이 사용된다는 의미입니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!