基本上 Go 大部分的功能我們都講過了,不過我們還沒提到網路的部份,這邊會用例子來講解怎麼使用 Go 來發 GET 跟 POST。
###GET/POST
首先我們看一下下面這個簡單的例子:
func httpGet() {
resp, err := http.Get("https://tw.yahoo.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
// handle error
}
fmt.Println(string(body))
}
你可以看到,這是一個 function ,我們利用 http.get 的方法來將 request 送給 Yahoo ,Get 方法會返回兩個數值,一個是 response 另一個是 error ,後面利用 defer 來確定是否有收到,然後將 response 裡的 Body 也就是網頁內容讀取出來,然後轉成字串印出。
func httpPost() {
resp, err := http.Post("https://tw.yahoo.com/",
"application/x-www-form-urlencoded",
strings.NewReader("name=test"))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
// handle error
}
fmt.Println(string(body))
}
POST 其實大部份就跟 GET 相同,但是不一樣的是 POST 通常傳的資料會比較多,所以這邊可以在後面的參數加上你要傳給伺服器的參數,另外需要特別注意的是,必須使用 application/x-www-form-urlencoded 才能正確的傳值喔!!
這樣的方法其實不好閱讀跟維護,所以 Go 支援另外一個方法:
resp, err := http.PostForm("https://tw.yahoo.com/",
url.Values{"key": {"Value"}, "id": {"test"}})
注意到了吧!我們可以利用 PostForm 方法來送 request 並且用鍵與值的方式來輸入資料,增加可閱讀性。
如果你想要輸入更複雜的參數,例如 Cookie 等,你可以使用 client.Do 方法來處理:
client := &http.Client{}
req, err := http.NewRequest("POST", "https://tw.yahoo.com/", strings.NewReader("name=test"))
if err != nil {
// handle error
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("Cookie", "name=test")
resp, err := client.Do(req)
defer resp.Body.Close()
首先先宣告 http.Clinet 方便我們後面使用,前面輸入的方法差不多,不同的是你這邊可以設置正加詳細的參數,最後再用 client.Do 送出。
resp, err := client.Do(req)
defer resp.Body.Close()
中間好像少了
if err != nil {
// handle error
}
這樣會造成defer resp.Body.Close()
跳出警告