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

相关推荐
芝士爱知识a17 分钟前
2026年AI面试软件推荐
人工智能·面试·职场和发展·大模型·ai教育·考公·智蛙面试
石去皿1 小时前
大模型面试通关指南:28道高频考题深度解析与实战要点
人工智能·python·面试·职场和发展
C雨后彩虹2 小时前
CAS与其他并发方案的对比及面试常见问题
java·面试·cas·同步·异步·
美团程序员2 小时前
80道经典常见测试面试题
软件测试·面试·职场和发展·软件测试面试
测试秃头怪2 小时前
面试大厂就靠这份软件测试八股文了【含答案】
自动化测试·软件测试·python·功能测试·面试·职场和发展·单元测试
测试杂货铺2 小时前
软件测试面试题大全,你要的都在这。。
自动化测试·软件测试·python·功能测试·面试·职场和发展·测试用例
职豚求职小程序2 小时前
校园招聘——荣耀2025秋招,有哪些值得注意的信息?(含荣耀笔面试攻略)
面试·职场和发展
java1234_小锋3 小时前
Java高频面试题:SpringBoot为什么要禁止循环依赖?
java·开发语言·面试
索荣荣4 小时前
Java Session 全面指南:原理、应用与实践(含 Spring Boot 实战)
java·spring boot·后端
千寻技术帮5 小时前
10333_基于SpringBoot的家电进存销系统
java·spring boot·后端·源码·项目·家电进存销