공부/Go

golang http 코드 예시(golang http skeleton code)

토고미 2021. 9. 20. 23:22

어딘가에 유용하게 쓰기위해 함수를 따로 만들어봤다.

method, request url, request body를 파라미터로 받고, response body를 return해주는 함수이다.

func ExecuteAPI(method string, url string, data interface{}) []byte {
	fmt.Println("===============")
	fmt.Println(method, url)

	var req *http.Request
	var err error
	client := &http.Client{}

	if data != nil { // POST, PUT, DELETE....
		json_body, err := json.Marshal(data)
		if err != nil {
			fmt.Errorf(err.Error())
			return nil
		}

		req, err = http.NewRequest(method, url, bytes.NewBuffer(json_body))
		if err != nil {
			fmt.Errorf(err.Error())
			return nil
		}
 		// content-type이 json이 아니라면 변경할 것
		req.Header.Set("Content-Type", "application/json")
	} else { // GET...
		req, err = http.NewRequest(method, url, nil)
		if err != nil {
			fmt.Errorf(err.Error())
			return nil
		}
	}

	// 필요한 헤더는 여기에 설정
	req.Header.Set("헤더 키", "헤더 값")

	resp, err := client.Do(req)
	if err != nil {
		fmt.Errorf(err.Error())
		return nil
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Errorf(err.Error())
		return nil
	}

	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
		fmt.Println("http 에러!!")
		fmt.Println("응답 코드 :", resp.StatusCode)
		return nil
	}

	return body
}

특별히 다른 헤더값이 필요하다면, 중간에 내가 주석으로 표시한 곳에 추가하고싶은 헤더값을 추가해주면 된다

 

 

사용법은 아래와 같다.

body := ExecuteAPI("GET", "http://togomi.tistory.com/hello", nil)
var hello model.Hello
json.Unmarshal(body, &hello)

for _, loc := range hello {
	fmt.Println("id :", hello.Id)
	fmt.Println("num :", hello.Num)
}

물론 model 패키지에 Hello라는 구조체가 아래와 같이 선언돼있어야 한다.

type Hello struct {
	Id int `json:"id"`
	Num int `json:"num"`
}

 

POST의 경우도 GET과 같다.

body에 넣어줄 구조체를 미리 선언해서 값을 넣어준 뒤, 아래와 같이 함수를 호출하면 된다.

var myBody model.TestBody
myBody.name = "토고미"

body := ExecuteAPI("POST", "http://togomi.tistory.com/examlePost", myBody)

 

혹시 https의 TLS verfication skip을 하고싶다면 아래 설정을 추가하면 된다.

curl에서 -k 옵션과 같은 역할을 한다.

http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}

 

 

golang으로 http 통신을 구현하는 사람들에게 도움이 됐으면 한다.