因為參加的是 Modern Web 主題,不管怎樣,還是跟 Web 掛勾一下好了。
今天的主題是如何起一個 Web Server。
分析
Go 本身即有內帶一些可用的函式庫,廣大的 GitHub 上也有非常多套件可以參考。今天會使用 Gin。
Gin 使用很簡單,官方範例如下:
package main
import "github.com/gin-gonic/gin"
func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() }
|
啟動 Server 的方法就學 Laravel Artisan 好了:
API 設計直接以 command 的功能命名,先來做 generate 就好。
預計的效果如下:
GET /generate [ "張春", "李明", "劉家", "張志", "劉雅", "楊雅", "陳豪", "楊嬌", "劉明", "劉春" ]
|
開工
首先先把範例程式碼加入 Command:
package command
import ( "github.com/urfave/cli" "github.com/gin-gonic/gin" )
var ( ServeCommand = cli.Command{ Name: "serve", Usage: "啟動伺服器", Action: func(c *cli.Context) error { return serve(c) }, } )
func serve(c *cli.Context) error { server := gin.Default() server.GET(`/generate`, func(c *gin.Context) { c.JSON(200, gin.H{ "result": "ok", }) })
server.Run()
return nil }
|
這樣就能正常的打 /generate
API 了
$ go run main.go serve $ curl 127.0.0.1:8080/generate {"result":"ok"}
|
再來把 GenerateCommand
的實作搬來 serve
函式:
func serve(c *cli.Context) error { res, _ := provider.ParseFile(c.GlobalString("provider")) num := 10
server := gin.Default() server.GET(`/generate`, func(c *gin.Context) { generator := provider.Create() generator.Resource = res
s := []string{} for i := 0; i < num; i++ { s = append(s, generator.Name()) }
provider.Create() c.JSON(200, s) })
server.Run()
return nil }
|
num
先硬寫,後面再調整。
大功告成!
問題
上面的程式碼可以注意到:c.JSON
帶的第二個參數似乎是可以任意值的,這應該是 interface
的特色。
YAML 在實作的時候也一直看到 interface
,所以看來有機會還是得好好研究一下它。
展示
$ go run main.go serve $ curl 127.0.0.1:8080/generate ["李雅","王家","李婷","黃家","張嬌","李志","陳豪","楊婷","黃婷","楊婷"]
|
程式碼可以參考 PR Day 23
參考資料