본문으로 건너뛰기

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
}