Go 언어로 client 가 되어 요청을 할 때, 사용하는 방법이
net/http 사용하여 요청하는 방법이다.
<golang.site net/http>
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
// Request 객체 생성
req, err := http.NewRequest("GET", "http://csharp.tips/feed/rss", nil)
if err != nil {
panic(err)
}
//필요시 헤더 추가 가능
req.Header.Add("User-Agent", "Crawler")
// Client객체에서 Request 실행
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
// 결과 출력
bytes, _ := ioutil.ReadAll(resp.Body)
str := string(bytes) //바이트를 문자열로
fmt.Println(str)
}
내장 된 방법을 사용 하여 하는 방법도 괜찮긴 하지.. 그런데 사용해보고 느껴본 사람들은 알걸..
이 방법은 server health check (tcp check) 를 하지 않아서 server가 불안정하면 panic 이 발생한다.
(server 쪽 요청이 불가할때..)
그래서 server health check 하는 부분을 구현해줘야한다.
conn, err := net.DialTimeout("tcp", net.JoinHostPort(host, port), timeout)
net.DialTimeout 이런식으로 구현을 해줬던것으로 기억한다. connection 이 되면 요청했다.
이 부분 말고도 문제가 발생하는 부분이 또 있었는데..
req.Close = true
보통 example 이 이 부분을 해 놓지 않는데.. 요청 많을때 이것 때문에 panic 이 종종 발생한다.
그래서 req.Close = true 부분을 넣어줘야 한다.
req, err := http.NewRequest("GET", "http://csharp.tips/feed/rss", nil)
if err != nil {
panic(err)
}
req.Close = true
뭐.. Go 언어 기본 내장 된 net/http 으로 안정 된 client 를 만들긴 했었는데..
Go 언어의 유용한 module 찾아보다가 알게된 resty 를 소개하려고 한다.
REST 하게 요청할 때, 사용하면 좋은 module 이다.
https://github.com/go-resty/resty
Simple HTTP and REST client library for Go (inspired by Ruby rest-client)
Ruby 언어에서 영감을 받았다고 써있고..
사용해보니까 편하고.. 구현 된 코드보면 tcp 체크 및 예외 처리도 잘 되어있다.
Github 가 너무 잘 되어있어 간단하게 설치 및 소개를 하면..
1) install
limjian@Jians-MacBook-Pro-13 go-resty-test % go get github.com/go-resty/resty/v2
go: added github.com/go-resty/resty/v2 v2.7.0
go: added golang.org/x/net v0.0.0-20211029224645-99673261e6eb
2) API 테스트
https://jsonplaceholder.typicode.com/
간단하게 api 요청을 할 수 있는 site
url endpoint 에 맞춰 요청을 몇개만 해보자.
Github example 를 참고해서 간단하게 만들어보면
1) Get
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
client := resty.New()
resp, err := client.R().
EnableTrace().
Get("https://jsonplaceholder.typicode.com/posts")
if err != nil {
panic(err)
}
fmt.Println(resp)
}
main 함수를 실행시켜 보자.
limjian@Jians-MacBook-Pro-13 go-resty-test % go run main.go
[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
},
...
...
...
"userId": 10,
"id": 100,
"title": "at nam consequatur ea labore ea harum",
"body": "cupiditate quo est a modi nesciunt soluta\nipsa voluptas error itaque dicta in\nautem qui minus magnam et distinctio eum\naccusamus ratione error aut"
}
]
결과 값이 100개가 나와서 추렸고.. 너무 쉽게 Get 요청이 가능하다.
위에서 net/http 로 하나씩 구현하는것보다 resty 를 import 해서 사용하는게 훨씬 편하다.
2) Post
예제에 보면 Post 방식도 여러가지가 있고, 편하게 사용할수 있게 만들어 놨다.
header, body, result, error 등.. 전부 담을수 있다.
SetHeader()
SetBody()
SetResult()
SetError()
Post 부분을 간단히 만들어 보면
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
client := resty.New()
resp, err := client.R().
SetBody(`{"userId":"1", "title":"Test", "body":"resty post test"}`).
Post("https://jsonplaceholder.typicode.com/posts")
if err != nil {
panic(err)
}
fmt.Println(resp)
fmt.Println(resp.Status())
}
main 함수를 실행하면 response 값을 받을수있고, 상태값을 확인해보니 201 Created 로 나온다.
limjian@Jians-MacBook-Pro-13 go-resty-test % go run main.go
{
"id": 101
}
201 Created
Github 에 설명이 너무 잘 나와있어 이 정도로 소개를 하고,
일단 매우 편하고, 잘 구현되어있는 module 같다. 사용 하는것은 좋은데
꼭 안에 있는 함수들이 어떤식으로 구현되어있는지 보면 좋을것 같다. 정말로..
'Language > Go' 카테고리의 다른 글
[Go] env file ( godotenv ) (0) | 2022.07.06 |
---|---|
[Go] net Dial, DialTimeout (check tcp port open) (0) | 2022.07.04 |
[Go] Go version upgrade (change) (0) | 2022.06.05 |
[Go] Jira API (go-jira) (0) | 2022.01.28 |
[Go] 배열 (0) | 2021.11.28 |