在这篇博客文章中,您将学习如何使用Go-Chi在Go中编写REST API。
介绍
go-chi是一种轻巧,惯用和可组合的路由器,用于构建go http服务(直接从网站复制)。
先决条件
Go 1.1x
或更高版本应安装在机器中。
代码
因此,我们将从一个单个文件main.go
中编写所有代码开始,因为无需遵循此类简单示例的文件夹结构模式。
└── go-api
├── go.mod
├── go.sum
├── main.go
└── Makefile
让我们在我们的
中写下基本运行命令Makefile
run:
@go run main.go
main.go
package main
import "fmt"
func main() {
fmt.Println("Hello, go-chi!!")
}
现在,运行命令安装go-chi
go get -u github.com/go-chi/chi/v5
让我们开始创建一个将保留Go-Chi提供的路由器的服务器结构。
package main
import (
"fmt"
"net/http"
"github.com/go-chi/chi/v5"
)
type Server struct {
Router *chi.Mux
}
func CreateServer() *Server {
server := &Server{
Router: chi.NewRouter(),
}
return server
}
func main() {
server := CreateServer()
fmt.Println("server running on port:5000")
http.ListenAndServe(":5000", server.Router)
}
在终端中运行命令make run
,您会看到服务器运行
➜ go-api git:(main) ✗ make run
server running on port:5000
,但我们无法击中任何端点,因为我们没有创建任何端点。因此,让我们创建一个基本的GET /greet
端点
func Greet(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!!"))
}
func (server *Server) MountHandlers() {
server.Router.Get("/greet", Greet)
}
func main() {
server := CreateServer()
server.MountHandlers()
fmt.Println("server running on port:5000")
http.ListenAndServe(":5000", server.Router)
}
您可以看到,我们创建了一个基本的问候处理程序,当您击中http://localhost:5000/greet
时将返回"Hello, World!!"
➜ go-api git:(main) ✗ curl -X GET 'http://localhost:5000/greet'
Hello, World!!
现在,让我们为基本的Todos应用创建CRUD端点。
func (server *Server) MountHandlers() {
server.Router.Get("/greet", Greet)
todosRouter := chi.NewRouter()
todosRouter.Group(func(r chi.Router) {
r.Get("/", GetTodos)
r.Post("/", AddTodo)
})
server.Router.Mount("/todos", todosRouter)
}
type Todo struct {
Task string `json:"task"`
Completed bool `json:"completed"`
}
var Todos []*Todo
func AddTodo(w http.ResponseWriter, r *http.Request) {
todo := new(Todo)
if err := json.NewDecoder(r.Body).Decode(todo); err != nil {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte("Please enter a correct Todo!!"))
return
}
Todos = append(Todos, todo)
w.WriteHeader(http.StatusOK)
w.Write([]byte("Todo added!!"))
}
func GetTodos(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(Todos)
}
我们可以创建不同的端点组,然后我们可以使用自己的上下文路径将它们安装到我们的主路由器上。
在上面的代码中,我们创建了一个两个端点GET /todos
(返回todos),POST /todos
(将todos添加到todos数组中)。我们将这些烟道存储在内存阵列中,用AddTodo
函数编写的代码,我们首先在Todo
struct中解码请求主体,如果有错误,我们返回不良请求,否则我们将破坏的todo添加到我们的数组中。
使用curl
点击下面的端点
➜ go-api git:(main) ✗ curl -X POST 'http://localhost:5000/todos' -d '{"task": "Learn Go", "completed": false}'
Todo added!!
➜ go-api git:(main) ✗ curl -X GET 'http://localhost:5000/todos'
[{"task":"Learn Go","completed":false}]
我鼓励您独自编写PUT /todos
,DELETE /todos
端点。
结论
就是这样,这是首发程序更像是一个介绍,但是在Upcomm的博客中,我们将介绍多个主题,例如
- 连接到
MySQL
,MongoDB
等数据库 - 用户
Authentication
和Authorization
,受保护的路线等 - 内存中缓存,使用
Redis
缓存等 - 记录和更多!
github :https://github.com/the-arcade-01/go-api
感谢您的阅读直到最后,非常感谢!