func main() { // 略 engine.POST("/todo/create", todoHandler.HandleTodoCreate) engine.GET("/todo/get", todoHandler.HandleTodoGet) engine.POST("/todo/update/:id", todoHandler.HandleTodoUpdate) engine.DELETE("/todo/delete/:id", todoHandler.HandleTodoDelete) /* ===== サーバの起動 ===== */ log.Println("Server running...") engine.Run(":8080") }
こんな感じでコードを書いていたのですが、「apiのパスが一般的なrestのpath設計となっていない」というコメントを頂き、何が良くないのか考えてみました。
REST APIエンドポイントの命名について✍️
調べていくうちにわかったこと:
- 一般にURIは、実行される機能を表す動詞を付加するのではなく、リソースの内容を特定する名詞での命名が望ましい。
例えば、
engine.POST("/todo/create", todoHandler.HandleTodoCreate)
におけるcreateは必要ないということです。これは、CRUD機能がすでにPOSTのように、httpリクエストで指定されているためです。 (ただし、REST の構造にマッチさせられないアクションは、/search のようなエンドポイントを作ることもあります) - 直感的でわかりやすく、省略形でない名称を使う
- _やキャメルケースを使うのではなく、ハイフンを使う
- 小文字を使う
- ファイル拡張子を避ける
- KISS の原則に従い、エンドポイントは一貫して複数形を使う
以上のことから、
engine.POST("/todos", todoHandler.HandleTodoCreate) engine.GET("/todos", todoHandler.HandleTodoGet) engine.PUT("/todos/:id", todoHandler.HandleTodoUpdate) engine.DELETE("/todos/:id", todoHandler.HandleTodoDelete)
このように直すと良さそうだとわかりました。