HTTP GET 헤더추가 + gzip 처리
웹 관련 개발을 하게되면 HTTP GET 방식으로 단순 데이터를 수신해야 하는 경우가 있습니다. 이런 경우 Response 데이터의 크기가 큰 경우에 서버측에서 데이터를 gzip 으로 압축해서 전송하는 경우도 종종 있습니다. 트래픽 비용을 cpu 연산으로 커버 치는 샘이겠지요..
이런식의 처리가 가능하려면 Reqeust Header 상에도 accept-encoding 같은 정보에 gzip 을 지원 한다는 명시를 해주지 않을 경우 서버측에선 에러를 리턴하게 됩니다.
상대가 gzip 압축을 처리하지 못한다는데 굳이 gzip 으로 압축된 응답을 할 이유 자체가 없기 때문이겠지요 ..
여튼 그런 상황에서 사용 가능한 간단한 함수하나 던져봅니다.
Go
var UserAgentValue string = "
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
func GetHttpData(url string, referer string) ([]byte, error) {
// Request 객체 생성
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
//필요시 헤더 추가 가능
req.Header.Add("user-agent", UserAgentValue)
req.Header.Add("accept", "application/json, text/javascript, /; q=0.01")
req.Header.Add("accept-encoding", "gzip, deflate, br")
req.Header.Add("accept-language", "ko,en;q=0.9,en-US;q=0.8,ru;q=0.7")
if referer != "" {
req.Header.Add("referer", referer)
}
// Client객체에서 Request 실행
client := &http.Client{}
rep, err := client.Do(req)
if err != nil {
return nil, err
}
defer func() {
rep.Body.Close()
}()
var reader io.ReadCloser
switch rep.Header.Get("Content-Encoding") {
case "gzip":
reader, err = gzip.NewReader(rep.Body)
if err != nil {
return nil, err
}
defer reader.Close()
default:
reader = rep.Body
}
buf, bufErr := ioutil.ReadAll(reader)
if bufErr != nil {
return nil, bufErr
}
return buf, nil
}