在server運作過程中,有時你所需要的資料會需要從別的服務取的,這時你的服務就需要跟對方的服務進行溝通,
其中一個方法是上一章提到的GRPC,雙方透過定義好的規格溝通,另一種方式就是透過http來進行溝通。
在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會要求傳表單過去,因此在go內使用的話可以使用一個已經組合好的方法:
postRes, postErr := http.PostForm("http://game.com/list", url.Values{"id": {"12345"}, "name": {"testGame"}})
if postErr != nil {
//處理錯誤
}
傳回來的回應也是http.Response,因此處理方式和上面一樣。
當需要傳遞比較複雜的資料,例如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。