清风徐来
Michael's Blog
拆分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.goe.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