iT邦幫忙

DAY 26
0

初學 Golang 30 天系列 第 26

初學 Golang 30 天(二十六)GET/POST

  • 分享至 

  • xImage
  •  

基本上 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 送出。


上一篇
初學 Golang 30 天(二十五)正則表達式
下一篇
初學 Golang 30 天(二十七)Martini
系列文
初學 Golang 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
screenleon
iT邦新手 1 級 ‧ 2020-04-27 17:33:03
resp, err := client.Do(req)  
 
defer resp.Body.Close()  

中間好像少了

if err != nil {  
// handle error  
}

這樣會造成defer resp.Body.Close() 跳出警告

我要留言

立即登入留言