透過例子我們可以越來越接近go在真實使用情境的樣貌。昨天我們聊到微服務透過API彼此溝通,今天我們來試試看實作簡易的API Server,首先我們在第八天知道可以透過網址得到參數的方法:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe("localhost:3000", nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}
透過r.URL.Path
我們可以得到根目錄下的字串,去掉斜線後就是我們要的值。比方說訪問網址http://localhost:3000/123
我們會得到:
URL.Path = "/123"
也就是說r.URL.Path
等於"/123"
,能取到值,剩下的就只是轉換的問題了。
首先來看看以布林值作為參數的類型(為了簡化只貼上相關的程式,完整版請見github):
func main() {
http.HandleFunc("/bool/", isHappy)
if err := http.ListenAndServe(":3000", nil); err != nil {
panic(err)
}
}
func isHappy(w http.ResponseWriter, r *http.Request) {
a := strings.Split(r.URL.Path, "=")
_, b := a[0], a[1] == "true"
if b {
fmt.Fprint(w, "I am a Happy man")
} else {
fmt.Fprint(w, "I am not a Happy man")
}
}
程式可能有點醜,但一開始學習先求會動,會動以後我們再持續精進,讓code越來越美麗。接下來我們訪問瀏覽器:
// 我懶得截圖,以下是網址與頁面得到的結果的對應
http://localhost:3000/bool/isHappy=true
> "I am a Happy man"
http://localhost:3000/bool/isHappy=false
> "I am not a Happy man"
都可以得到預期的結果,很好。
數字是API中最常見的型態,今天的範例暫時不連動到model與資料庫,我們來試著處理簡單的數學運算:
func main() {
http.HandleFunc("/num/", add)
if err := http.ListenAndServe(":3000", nil); err != nil {
panic(err)
}
}
func add(w http.ResponseWriter, r *http.Request) {
a := strings.Split(r.URL.Path, "/")
_, _, s := a[0], a[1], a[2]
i, err := strconv.Atoi(s)
if err != nil {
panic(err)
} else {
fmt.Fprintf(w, "n + 100 = %d\n", i+100)
}
}
恩,一樣寫得很醜,但是功能合乎預期,我們來看看網頁結果:
http://localhost:3000/num/1000
> n + 100 = 1100
http://localhost:3000/num/123
> n + 100 = 223
掌握了這兩種基本型態,剩下的也就只是型態轉換與資料庫互動的問題。我相信go應該會有處理網址參數更聰明的方法,現在先讓我們土法煉鋼一下吧!
今天比較特別,沒有參考網站,自己出題自己解開!硬要說的話,參考了第八天Web Server。