拆分echo示例项目的crud模块
拆分echo示例项目的crud模块的源文件。
对于那些经常写golang的人来说,这可能很无聊。
目录结构
➜ crud tree
.
├── handler
│ ├── create.go
│ ├── delete.go
│ ├── list.go
│ └── update.go
├── model
│ └── user.go
└── router.go
router.go
package main
import (
"./handler"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
)
func main() {
e := echo.New()
//middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
//routes
e.GET("/users", handler.ListUser)
e.GET("/users/:id", handler.GetUser)
e.POST("/users", handler.CreateUser)
e.PUT("/users/:id", handler.UpdateUser)
e.DELETE("/users/:id", handler.DeleteUser)
//start server
e.Logger.Fatal(e.Start(":8000"))
}
model/user.go
package model
type (
User struct {
ID int `json:"id"`
Name string `json:"name"`
}
)
//这是一个持久层,基本上被DB取代的区域
var (
Users = map[int]*User{}
Seq = 1
)
handler目录
用于存储业务逻辑的区域,使用Service可能更好
create.go
package handler
import (
"net/http"
"../model"
"github.com/labstack/echo"
)
func CreateUser(c echo.Context) (err error) {
u := &model.User{
ID: model.Seq,
}
if err := c.Bind(u); err != nil {
return err
}
model.Users[u.ID] = u
model.Seq++
return c.JSON(http.StatusCreated, u)
}
在router.go
中,e.POST(“/ users”,handler.CreateUser)
接收以下POST请求并存储数据
➜ ~ curl -v POST -H "Content-Type:application/json" "http://localhost:8000/users" -d '{"id":1,"name":"Mike Yang"}'
update.go
package handler
import (
"net/http"
"strconv"
"../model"
"github.com/labstack/echo"
)
func UpdateUser(c echo.Context) (err error) {
u := new(model.User)
if err := c.Bind(u); err != nil {
return err
}
id, _ := strconv.Atoi(c.Param("id"))
model.Users[id].Name = u.Name
return c.JSON(http.StatusOK, model.Users[id])
}
在router.go
中,e.PUT(“/ users /:id”,handler.UpdateUser)
接收以下PUT请求并更新数据
➜ ~ curl -v -X PUT -H "Content-Type: application/json" "http://localhost:8000/users/1" -d '{
"name" : "Andy Liu"
}'
list.go
package handler
import (
"net/http"
"strconv"
"../model"
"github.com/labstack/echo"
)
func GetUser(c echo.Context) (err error) {
id, _ := strconv.Atoi(c.Param("id"))
return c.JSON(http.StatusOK, model.Users[id])
}
func ListUser(c echo.Context) (err error) {
return c.JSON(http.StatusOK, model.Users)
}
使用router.go
的 e.GET(“/ users”,handler.ListUser)
或e.GET(“/ users /:id”,handler.GetUser)
接收以下GET请求并获取数据。
➜ ~ curl -i -v GET http://localhost:8000/users
➜ ~ curl -i -v GET http://localhost:8000/users/1
delete.go
package handler
import (
"log"
"net/http"
"strconv"
"../model"
"github.com/labstack/echo"
)
func DeleteUser(c echo.Context) (err error) {
log.Println(model.Users)
id, _ := strconv.Atoi(c.Param("id"))
delete(model.Users, id)
log.Println(model.Users)
return c.NoContent(http.StatusNoContent)
}
测试
curl -i -v -X DELETE "http://localhost:8000/users/1"
结束
没有涉及到DB的操作 还有错误处理、模板等
最后修改于 2019-09-03