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()
}


'언어 > Golang' 카테고리의 다른 글

[Golang] 에러  (0) 2020.02.23
[Golang] package 관리, 선언하기  (0) 2020.02.16
[Golang] http 모듈 사용하기  (0) 2020.02.16
[Golang] map  (0) 2020.02.09
[Golang] 배열 (array) & 슬라이스 (slice)  (0) 2020.02.09
[Golang] 함수 (function)  (0) 2020.02.09
[GO] 데이터 타입 & 연산자  (0) 2020.02.09