概要 †Go で簡単なWebAPIサーバを書いてみる。 目次 †インストール †ginのインストール go get -u github.com/gin-gonic/gin サンプル作成 †まずは gin の Quick start の通りに書いてみる。 main.go package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "pong!", }) }) r.Run() } 実行 go run main.go [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env: export GIN_MODE=release - using code: gin.SetMode(gin.ReleaseMode) 動作確認 curl -v http://localhost:8080/ping * About to connect() to localhost port 8080 (#0) * Trying 127.0.0.1... connected * Connected to localhost (127.0.0.1) port 8080 (#0) > GET /ping HTTP/1.1 > User-Agent: curl/7.21.4 (x86_64-apple-darwin12.2.0) libcurl/7.21.4 OpenSSL/0.9.8} zlib/1.2.11 libidn/1.20 > Host: localhost:8080 > Accept: */* > < HTTP/1.1 200 OK < Content-Type: application/json; charset=utf-8 < Date: Sun, 12 Jul 2020 11:19:18 GMT < Content-Length: 19 < * Connection #0 to host localhost left intact * Closing connection #0 {"message":"pong!"} 問題なさそう。 入力値の受け取り †ここからは gin での作法になるが、リクエストデータから入力値を受け取って、編集したメッセージを返却するサンプルを作成する。 main.go package main import ( "github.com/gin-gonic/gin" "net/http" "fmt" ) // リクエストデータの定義 type JsonRequest struct { Name string `json:"name"` Age int `json:"age"` Sex string `json:"sex"` } func main() { r := gin.Default() r.GET("/emp/:id", func(c *gin.Context) { id := c.Param("id") // パスパラメータの受け取り param1 := c.Query("param1") // クエリ文字列の受け取り message := fmt.Sprintf("id: %s, param1: %s", id, param1) c.JSON(http.StatusOK, gin.H{ "message": message, }) }) r.POST("/emp", func(c *gin.Context) { // JSONデータの受け取りは構造体を使用する var json JsonRequest if err := c.ShouldBindJSON(&json); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // フォームデータはPostFormで受け取る //name := c.PostForm("name") //age := c.PostForm("age") //sex := c.PostForm("sex") message := fmt.Sprintf("name: %s, age: %d, sex: %s", json.Name, json.Age, json.Sex) c.JSON(http.StatusOK, gin.H{ "message": message, }) }) r.Run() } 動作確認 curl -XPOST --data '{"name": "Taro", "age": 20, "sex": "man"}' -H "Content-Type: app;ication/json" http://localhost:8080/emp {"message":"name: Taro, age: 20, sex: man"} HTTPヘッダの追加/変更 †gin.Context.Header で設定する事ができる。 例) func(c *gin.Context) { c.Header("Access-Control-Allow-Origin", "*") c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE") c.Header("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization") } |