Huma:一个现代化的Go微框架

Huma是一个为Go语言设计的现代化、简单、快速且灵活的微框架,用于构建HTTP REST/RPC API。它支持OpenAPI 3和JSON Schema,旨在为开发者提供一个高效的后端API开发环境。

Huma的主要特点

  • 灵活性:支持自定义路由器(如Go 1.22+的标准库路由器)、中间件和日志/指标系统。
  • 文档生成:自动根据OpenAPI和JSON Schema生成文档,确保文档始终与代码同步。
  • 错误处理:使用RFC 9457和application/problem+json格式处理错误。
  • 内容协商:支持JSON和CBOR格式的内容协商。
  • 条件请求:支持If-Match或If-Unmodified-Since等条件请求头。
  • PATCH操作:支持RFC 7386 JSON Merge Patch和RFC 6902 JSON Patch。
  • 静态类型:支持静态类型的路径、查询、头部参数、请求体等。
  • 自动验证:自动验证输入模型并处理错误。

安装Huma

要使用Huma,首先需要安装Go 1.21或更高版本,然后使用以下命令安装Huma:

arduino 复制代码
bash
go get -u github.com/danielgtaylor/huma/v2

基本示例

以下是一个简单的"Hello World"示例,展示如何使用Huma创建一个API:

go 复制代码
go
package main

import (
	"context"
	"fmt"
	"net/http"

	"github.com/danielgtaylor/huma/v2"
	"github.com/danielgtaylor/huma/v2/adapters/humachi"
	"github.com/danielgtaylor/huma/v2/humacli"
	"github.com/go-chi/chi/v5"

	_ "github.com/danielgtaylor/huma/v2/formats/cbor"
)

// CLI选项
type Options struct {
	Port int `help:"Port to listen on" short:"p" default:"8888"`
}

// 响应结构体
type GreetingOutput struct {
	Body struct {
		Message string `json:"message" example:"Hello, world!" doc:"Greeting message"`
	}
}

func main() {
	// 创建CLI应用
	cli := humacli.New(func(hooks humacli.Hooks, options *Options) {
		// 创建路由器和API
		router := chi.NewMux()
		api := humachi.New(router, huma.DefaultConfig("My API", "1.0.0"))

		// 添加操作处理函数
		huma.Get(api, "/greeting/{name}", func(ctx context.Context, input *struct {
			Name string `path:"name" maxLength:"30" example:"world" doc:"Name to greet"`
		}) (*GreetingOutput, error) {
			resp := &GreetingOutput{}
			resp.Body.Message = fmt.Sprintf("Hello, %s!", input.Name)
			return resp, nil
		})

		// 启动服务器
		hooks.OnStart(func() {
			http.ListenAndServe(fmt.Sprintf(":%d", options.Port), router)
		})
	})

	// 运行CLI
	cli.Run()
}

测试API

使用以下命令运行示例:

go 复制代码
bash
go run greet.go

然后,可以使用Restish或curl测试API:

bash 复制代码
bash
restish :8888/greeting/world

文档和OpenAPI

访问http://localhost:8888/docs查看生成的文档,访问http://localhost:8888/openapi.jsonhttp://localhost:8888/openapi.yaml查看OpenAPI定义。

使用标准库路由器

如果你使用Go 1.22或更高版本,可以通过以下方式切换到标准库路由器:

css 复制代码
go
router := http.NewServeMux()
api := humago.New(router, huma.DefaultConfig("My API", "1.0.0"))

确保你的go.mod文件中指定了Go 1.22或更高版本。

相关推荐
想用offer打牌8 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
passerby60619 小时前
完成前端时间处理的另一块版图
前端·github·web components
KYGALYX9 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了9 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法10 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
Moment10 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
草梅友仁11 小时前
墨梅博客 1.4.0 发布与开源动态 | 2026 年第 6 周草梅周报
开源·github·ai编程
Cobyte11 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc
程序员侠客行12 小时前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
Honmaple12 小时前
QMD (Quarto Markdown) 搭建与使用指南
后端