go-http-request


고언어에서 HTTP request하는 법을 포스팅한다.

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
)

func main() {
    // data
    uri := &url.Values{}
    uri.Add("bar", "foo")

    // request
    req, err := http.NewRequest("GET", "http://www.naver.com", bytes.NewBufferString(uri.Encode()))
    if err != nil {
        panic(err)
    }
    // set header
    req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36")
    // request
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    // read response
    data, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(data))
}

데이터를 보내기 위해 urlencoding 을 해서 string으로 만들고 싶을때는 net/url 패키지에서 url.Values 를 사용하면 된다. Add메서드로 Key value 추가가능

bytes 패키지를 통해 string으로 부터 byte buffer를 만들어내는 NewBufferString 메서드를 사용하여 데이터로 보내면 된다.

헤더는 request 에서 Header를 통해 추가한다.

이렇게 만든 request를 가지고 Client .Do 메서드를 사용하여 응답을 받는데 이때 ioutil을 사용하여 읽어낸다. 바이트로 리턴되므로 string으로 변환하면 응답 html를 구할수 있다.

Query string 처리

    req, err := http.NewRequest("GET", urlStr, nil)
    if err != nil {
        return nil, err
    }
    // Set parameters
    query := req.URL.Query()
    query.Add("bar", "foo")
    
    req.URL.RawQuery = query.Encode()

깔끔하게 key value 로 추가 가능하다. 복잡하게 포맷문자열을 생성하지 않아도 된다.