>  기사  >  백엔드 개발  >  golang에서 청크 인코딩을 끄는 방법

golang에서 청크 인코딩을 끄는 방법

PHPz
PHPz원래의
2023-04-04 16:13:14689검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.