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或更高版本。

相关推荐
东阳马生架构3 小时前
Dubbo源码—6.Provider端的主要模块上
后端
Re2755 小时前
数据库里的「暗锁」:逻辑外键为什么悄悄流行起来?
后端
寻月隐君8 小时前
Rust 实战:从零构建一个多线程 Web 服务器
后端·rust·github
草梅友仁8 小时前
草梅 Auth 1.3.0 发布与 GitHub 动态 | 2025 年第 32 周草梅周报
开源·github·ai编程
Livingbody8 小时前
FastMCP In Action之 Server详解
后端
GetcharZp9 小时前
C++ Boost 从入门到精通:让你的代码飞起来
c++·后端
北'辰10 小时前
DeepSeek智能考试系统智能体
前端·后端·架构·开源·github·deepseek
hrrrrb10 小时前
【Spring Boot 快速入门】八、登录认证(二)统一拦截
hive·spring boot·后端
在未来等你10 小时前
RabbitMQ面试精讲 Day 16:生产者优化策略与实践
中间件·面试·消息队列·rabbitmq
_風箏12 小时前
OpenSSH【安装 03】远程代码执行漏洞CVE-2024-6387修复(cp: 无法创建普通文件“/usr/sbin/sshd“:文本文件忙问题处理)
后端