-
[Golang] http 모듈 사용하기언어/Golang 2020. 2. 16. 20:29
Go에서 제공하는 http 모듈을 사용하면 보다 쉽게 데이터를 전송하고 가져올 수 있습니다.
GET Method 사용하기
http.Get 메소드를 사용하면 쉽게 요청을 보낼 수 있지만 헤더나 스트림을 추가할 수 없습니다. 따라서 NewRequest 객체를 직접 생성하고 http.Client 객체를 통해 호출해야 합니다.
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func simpleGet() {
// header나 추가적인 요청을 보낼 수 없음
resp, err := http.Get("https://naver.com")
if err != nil {
panic(err)
}
defer resp.Body.Close()
// 결과 출력
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Printf("%s\n", string(data))
}
func customGet() {
// Request 객체 생성
req, err := http.NewRequest("GET", "https://naver.com", nil)
if err != nil {
panic(err)
}
//헤더 추가
req.Header.Add("User-Agent", "Golang-test")
// 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)
}
func main() {
simpleGet()
customGet()
}POST Method 사용하기
Get과 유사하게 http.post를 사용하여 간편하게 사용할 수 있지만 header나 다른 추가적인 행동이 제약되어 있습니다.
package main
import (
"bytes"
"encoding/json"
"encoding/xml"
"io/ioutil"
"net/http"
)
//Person -
type Person struct {
Name string
Age int
}
func simpleTextPost() {
reqBody := bytes.NewBufferString("Post plain text")
resp, err := http.Post("http://httpbin.org/post", "text/plain", reqBody)
if err != nil {
panic(err)
}
defer resp.Body.Close()
// Response 체크.
respBody, err := ioutil.ReadAll(resp.Body)
if err == nil {
str := string(respBody)
println(str)
}
}
func simpleJSONPost() {
person := Person{"Alex", 10}
pbytes, _ := json.Marshal(person)
buff := bytes.NewBuffer(pbytes)
resp, err := http.Post("http://httpbin.org/post", "application/json", buff)
defer resp.Body.Close()
// Response 체크.
respBody, err := ioutil.ReadAll(resp.Body)
if err == nil {
str := string(respBody)
println(str)
}
}
func simpleXMLPost() {
person := Person{"Alex", 10}
pbytes, _ := xml.Marshal(person) // xml marshal
buff := bytes.NewBuffer(pbytes)
resp, err := http.Post("http://httpbin.org/post", "application/xml", buff)
defer resp.Body.Close()
// Response 체크.
respBody, err := ioutil.ReadAll(resp.Body)
if err == nil {
str := string(respBody)
println(str)
}
}
func customPost() {
person := Person{"Alex", 10}
pbytes, _ := xml.Marshal(person)
buff := bytes.NewBuffer(pbytes)
// Request 객체 생성
req, err := http.NewRequest("POST", "http://httpbin.org/post", buff)
if err != nil {
panic(err)
}
//Content-Type 헤더 추가
req.Header.Add("Content-Type", "application/xml")
// Client객체에서 Request 실행
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
// Response 체크.
respBody, err := ioutil.ReadAll(resp.Body)
if err == nil {
str := string(respBody)
println(str)
}
}
func main() {
simpleTextPost()
simpleJSONPost()
simpleXMLPost()
customPost()
}