iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0

在server運作過程中,有時你所需要的資料會需要從別的服務取的,這時你的服務就需要跟對方的服務進行溝通,
其中一個方法是上一章提到的GRPC,雙方透過定義好的規格溝通,另一種方式就是透過http來進行溝通。

GET

在go內用get呼叫別的服務,可以靠內建的http套件,例如要對http://game.com/list 進行get,
可以像下面範例這樣:

res, err := http.Get("http://game.com/list")
if err != nil {
    //處理錯誤
}

這樣就可以取得該網址的回應,不過這時回傳回來的是http.Response檔,不能直接使用,要透過下面的方式取出:

    defer res.Body.Close()
	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		//處理錯誤
	}

這時取出的body會是[]byte形式,再看是json還是什麼格式,依照該格式決定如何拿出來。

POST

通常POST會要求傳表單過去,因此在go內使用的話可以使用一個已經組合好的方法:

    postRes, postErr := http.PostForm("http://game.com/list", url.Values{"id": {"12345"}, "name": {"testGame"}})
	if postErr != nil {
		//處理錯誤
	}

傳回來的回應也是http.Response,因此處理方式和上面一樣。

New Request

當需要傳遞比較複雜的資料,例如json或是需要增加header,上面的方法就不太夠用了,
這時可以使用另一個自訂程度比較高的方法,範例如下:

    client := &http.Client{}
    jsonData := []byte(`{"id":"123"}`)
	r := bytes.NewReader(jsonData)
	req, err := http.NewRequest("POST", "http://game.com/list", r)
	if err != nil {
		//處理錯誤
	}
	req.Header.Set("Content-Type", "application/json")
    res, err := client.Do(req)  

上面的範例是送出一個json,將json資料先轉成byte形式,再產生io.Reader,
設定好jsonHeader後,透過client.Do就可以將設定好的http request發送出去。
這樣想想,要發送一個http request需要設定一堆東西,有沒有比較方便的套件呢?
下一章就來介紹Greq這個套件,讓你更方便弄好http request。


上一篇
Day22-Grpc Client&Server
下一篇
Day24- http打其他服務:Greq
系列文
從0開始的golang web server30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言