공부/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 통신을 구현하는 사람들에게 도움이 됐으면 한다.