在使用Go-Chi的Go中写下API
#初学者 #api #go

在这篇博客文章中,您将学习如何使用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 /todosDELETE /todos端点。

结论

就是这样,这是首发程序更像是一个介绍,但是在Upcomm的博客中,我们将介绍多个主题,例如

  • 连接到MySQLMongoDB等数据库
  • 用户AuthenticationAuthorization,受保护的路线等
  • 内存中缓存,使用Redis缓存等
  • 记录和更多!

github https://github.com/the-arcade-01/go-api

感谢您的阅读直到最后,非常感谢!