crud

CRUD

原文:https://echo.labstack.com/docs/cookbook/crud

Server

cookbook/crud/server.go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package main

import (
	"net/http"
	"strconv"
	"sync"

	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)

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

var (
	users = map[int]*user{}
	seq   = 1
	lock  = sync.Mutex{}
)

//----------
// Handlers
//----------

func createUser(c echo.Context) error {
	lock.Lock()
	defer lock.Unlock()
	u := &user{
		ID: seq,
	}
	if err := c.Bind(u); err != nil {
		return err
	}
	users[u.ID] = u
	seq++
	return c.JSON(http.StatusCreated, u)
}

func getUser(c echo.Context) error {
	lock.Lock()
	defer lock.Unlock()
	id, _ := strconv.Atoi(c.Param("id"))
	return c.JSON(http.StatusOK, users[id])
}

func updateUser(c echo.Context) error {
	lock.Lock()
	defer lock.Unlock()
	u := new(user)
	if err := c.Bind(u); err != nil {
		return err
	}
	id, _ := strconv.Atoi(c.Param("id"))
	users[id].Name = u.Name
	return c.JSON(http.StatusOK, users[id])
}

func deleteUser(c echo.Context) error {
	lock.Lock()
	defer lock.Unlock()
	id, _ := strconv.Atoi(c.Param("id"))
	delete(users, id)
	return c.NoContent(http.StatusNoContent)
}

func getAllUsers(c echo.Context) error {
	lock.Lock()
	defer lock.Unlock()
	return c.JSON(http.StatusOK, users)
}

func main() {
	e := echo.New()

	// Middleware
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())

	// Routes
	e.GET("/users", getAllUsers)
	e.POST("/users", createUser)
	e.GET("/users/:id", getUser)
	e.PUT("/users/:id", updateUser)
	e.DELETE("/users/:id", deleteUser)

	// Start server
	e.Logger.Fatal(e.Start(":1323"))
}

Client

xxxxxxxxxx43 1package main2​3import (4 “net/http"5 “regexp"6​7 “github.com/labstack/echo/v4"8 “github.com/labstack/echo/v4/middleware"9)10​11var (12 users = []string{“Joe”, “Veer”, “Zion”}13)14​15func getUsers(c echo.Context) error {16 return c.JSON(http.StatusOK, users)17}18​19// allowOrigin takes the origin as an argument and returns true if the origin20// is allowed or false otherwise.21func allowOrigin(origin string) (bool, error) {22 // In this example we use a regular expression but we can imagine various23 // kind of custom logic. For example, an external datasource could be used24 // to maintain the list of allowed origins.25 return regexp.MatchString(^https:\/\/labstack\.(net|com)$, origin)26}27​28func main() {29 e := echo.New()30 e.Use(middleware.Logger())31 e.Use(middleware.Recover())32​33 // CORS restricted with a custom function to allow origins34 // and with the GET, PUT, POST or DELETE methods allowed.35 e.Use(middleware.CORSWithConfig(middleware.CORSConfig{36 AllowOriginFunc: allowOrigin,37 AllowMethods:   []string{http.MethodGet, http.MethodPut, http.MethodPost, http.MethodDelete},38 }))39​40 e.GET("/api/users”, getUsers)41​42 e.Logger.Fatal(e.Start(":1323”))43}go

Request

1
2
3
4
curl -X POST \
  -H 'Content-Type: application/json' \
  -d '{"name":"Joe Smith"}' \
  localhost:1323/users

Response

1
2
3
4
{
  "id": 1,
  "name": "Joe Smith"
}

Get user

Request

1
curl localhost:1323/users/1

Response

1
2
3
4
{
  "id": 1,
  "name": "Joe Smith"
}

Update user

Request

1
2
3
4
curl -X PUT \
  -H 'Content-Type: application/json' \
  -d '{"name":"Joe"}' \
  localhost:1323/users/1

Response

1
2
3
4
{
  "id": 1,
  "name": "Joe"
}

Delete user

Request

1
curl -X DELETE localhost:1323/users/1

Response

NoContent - 204
最后修改 October 10, 2024: 更新 (a4b8f85)