ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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()
    }


    댓글