読者です 読者をやめる 読者になる 読者になる

備忘録

なんとなく暇なときにでも....

golangのechoフレームワークを使ってRestfulAPIを作る ~JSON形式でのリクエストを受けとる~

フレームワークに人気上昇中らしいechoを使ってgolangを勉強してます。

echoの導入方法などは、別の方にお任せします。(「golang echo」などで検索すればヒットします。)

本日はサブタイトル通り”JSON形式でのリクエストを受け取ってレスポンスを返す”です。

以下のリクエストを送ります。

$curl -v POST -H "Content-Type: application/json" "http://localhost:3000/users" -d '{"name" : "Anthony Kiedis", "age":20}'

type (
    User struct {
        ID   int    `json:"id"`
        Name string `json:"name"`
        Age int  `json:"age"`
    }
)

var (
    Users = map[int]*User{}
    Seq = 1
)

func main() {
    e := echo.New()
 
    /**
    * Middleware
    */
    e.Use(middleware.Logger())
    e.Use(middleware.Recover())
 
    /**
    * Routing
    */
    e.POST("/users", CreateUser)
 
    // Start server
    e.Logger.Fatal(e.Start(":3000"))
}


func CreateUser(c echo.Context) error {
   // modelsで設定したUser構造体をインスタンス化(構造体の初期化方法は複数ある)
   user := new(User)
   c.JSON(http.StatusCreated, user)
   //->{"name":"","age":0}    
 
        // リクエストをUser構造体にbindする
    // cf. https://echo.labstack.com/guide/request
    if err := c.Bind(user); err != nil {
        return err
    }
 
    Users[user.ID] = user
    return c.JSON(http.StatusCreated, Users)
        //->{"name":"Anthony Kiedis","age":20}
}

1ファイルにまとめて書いていますが、実際のソースではMVCっぽくしたいのでmodels, controllerなどに適宜ファイルを分けています。

話が逸れますが、models, controllersを読み込む際に、importするときのファイルのパスは相対パスで書きました(非推奨な方法みたいな記事も見ましたが…)

本日はここまで

github.com