Grape:零依赖的 Go HTTP 库


Grape 是一个现代的、零依赖的 Go HTTP 库。
它是标准库的一个薄包装,提供帮助函数以促进更快、更轻松的开发。仅向您的项目添加一个依赖项。

Go 标准库非常棒。它快速、易用,而且拥有出色的 API。
在 go 1.21 中增加了 log/slog,在 go 1.22 中改进了 HTTP 路由器,在大多数情况下,没有太多理由再去寻找更多。Grape 的目标不是破坏与 net/http 的兼容性,而是在处理程序触手可及的范围内添加常用函数。

特征

  • 零依赖,100%兼容标准库
  • 使用log/slog进行结构化日志记录
  • 使用新的、改进的net/http路由器
  • 组路由和特定范围的中间件
  • 通过encoding/json读写json
  • 高度可定制;带上你自己的记录器和序列化器!
  • 用于常用 HTTP 状态代码响应的辅助函数
  • validator具有用于数据验证的内置包

用法
主要的使用模式是将 Grape 嵌入结构体中,处理程序是结构体的一个方法,与模型、设置等其他字段相邻。
在这种方法中,不需要改变处理程序的参数来接受特定的上下文;所有的辅助方法都可以通过接收器使用。

package main

import (
    "net/http"

    
"github.com/hossein1376/grape"
)

type handler struct {
    
// data/models
    
// settings
    grape.Server
}

func main() {
    h := handler{Server: grape.New()}
// grape.Server inside a struct
    r := grape.NewRouter()            
// grape.Router for routing and starting the server 

    r.Use(h.LoggerMiddleware, h.RecoverMiddleware)
    r.Get(
"/{id}", h.paramHandler)

    if err := r.Serve(
":3000"); err != nil {
        h.Error(
"failed to start server", "error", err)
        return
    }
}

func (h *handler) paramHandler(w http.ResponseWriter, r *http.Request) {
    h.Info(
"Param handler!")

    id := h.ParamInt(r,
"id")
    if id == 0 {
        h.NotFoundResponse(w)
        return
    }

    h.OkResponse(w, grape.Map{
"id": id})
}

  • grape.Server

提供日志记录、与 json 交互、常见 HTTP 响应和其他一些有用实用程序的方法。它可以嵌入到结构体中,作为常规字段放置,实例化为全局变量,甚至可以通过上下文传递。它的实例是通过运行创建的grape.New(),并且可以通过grape.Options 作为参数传递来自定义其行为。
  • *grape.Router

通过以 HTTP 动词命名的方法启用路由,并使用路由分组和特定于范围的中间件。通过运行创建一个新实例grape.NewRouter()。所有路由都在服务器启动时注册,其余路由由标准库处理,从而实现零运行时开销。
  • validator包

提供广泛的数据验证功能。使用 启动一个新实例validator.New(),然后Check数据的每个部分都包含Case必要的数量。