어딘가에 유용하게 쓰기위해 함수를 따로 만들어봤다.
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 통신을 구현하는 사람들에게 도움이 됐으면 한다.
'공부 > Go' 카테고리의 다른 글
Go API server template + Dockerfile & yaml (0) | 2022.07.09 |
---|---|
golang convert []byte(byte array) to map[string]interface{} (0) | 2022.06.22 |
golang convert json to interface (2) | 2021.10.20 |
golang context 개념 (0) | 2021.09.30 |
go mod download dial tcp i/o timeout 오류 (0) | 2021.09.06 |