使用者呼叫api時,會依照該api的功能,帶上不同的參數進來,但是這些參數不像go的函數互相呼叫那樣簡單獲得。
func getSum(x, y int) (int, error)
一般go的函數會像上面這樣,帶進來的參數就只會是x跟y,
x跟y也是固定的整數。
但是httphandler帶進來的參數長這樣
func ping() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
}
}
我們常常會使用curl來測試api,在呼叫的時候,常常看到像這樣的參數
curl https://webserver.com?id=123
或是將送出json格式的參數
curl "http://webserver.com/user" -H "Content-Type: application/json" -X POST -d '{"id":"123"}'
當我們的服務收到這些參數時,都是存放在http.Request內,
而我們要使用這些參數時,該怎麼辦呢?
在第一個範例內,透過curl帶上的參數,
可以透過下面的方式取得跟使用
vars := r.URL.Query()
idSlice, ok := vars["id"]
if ok {
if len(idSlice) != 0 {
id := idSlice[0]
}
}
透過URL.Query就可以取出參數來使用。
第二個範例裡,參數是以json的形式傳送過來的,這時就不會放在url.Values內了,
要取出參數必須要用這種方式
type userPara struct {
ID string `json:"id"`
}
reqBody, err := ioutil.ReadAll(r.Body)
if err !=nil {
...
}
idPara := &userPara{}
err = json.Unmarshal(reqBody, &idPara)
if err !=nil {
...
}
這樣就可以把參數unmarshal到idPara內了,不過這種unmarshal方式會消耗比較多的記憶體,
下一章我們會介紹另一個套件,可以更方便取出json內的參數,也比較節省記憶體。