首页 后端开发 Golang 根据我使用 Fuego 的经验,我是如何编写 Go API 的

根据我使用 Fuego 的经验,我是如何编写 Go API 的

Jan 10, 2025 am 08:37 AM

How I write Go APIs in  my experience with Fuego

我使用 Fuego 构建 Go API 的经验

作为一名拥有多年经验的 Go 开发人员,我探索了各种 Web 框架。 我的旅程包括标准库、Gin 和 Fiber。 虽然每个库都有优点,但我经常发现自己需要更多的结构或花费过多的时间来集成多个库以进行验证、序列化和文档记录。 这就是 Fuego 改变游戏规则的地方。

最初,Fuego 看起来只是另一个框架。然而,它使用现代 Go 功能(特别是泛型)来直接从代码自动生成 OpenAPI 规范,这引起了我的兴趣。我决定在一个小型内部项目上测试它,这是我的诚实帐户。


第一印象

Fuego 的简单性立即显而易见。 设置基本服务器只需几分钟:

package main

import "github.com/go-fuego/fuego"

func main() {
    s := fuego.NewServer()
    fuego.Get(s, "/", func(c fuego.ContextNoBody) (string, error) {
        return "Hello, World!", nil
    })
    s.Run()
}
登录后复制
登录后复制

熟悉程度是惊人的——类似于 Gin,但具有内置的 OpenAPI 支持。


现实世界的例子

“Hello World”示例并未反映现实世界的复杂性。我的应用程序需要 JSON 数据处理、验证和类型化响应。 其他框架需要自定义 JSON 解码、错误处理和中间件集成。 Fuego 使用类型化路由处理程序大大简化了这一过程。

这是一个简化的路由处理程序:

type UserInput struct {
    Name string `json:"name" validate:"required"`
}

type UserOutput struct {
    Message string `json:"message"`
}

func main() {
    s := fuego.NewServer()
    fuego.Post(s, "/user", handleUser)
    s.Run()
}

func handleUser(c fuego.ContextWithBody[UserInput]) (UserOutput, error) {
    in, err := c.Body()
    if err != nil {
        return UserOutput{}, err
    }
    return UserOutput{Message: "Hello, " + in.Name}, nil
}
登录后复制

主要改进:

  1. 类型化处理程序: fuego.ContextWithBody[UserInput] 自动将 JSON 反序列化为 UserInput 结构。
  2. 验证: validate:"required" 确保 Name 字段存在; Fuego 优雅地处理错误。
  3. 响应: 返回 UserOutput 结构会自动将其序列化为 JSON。

这消除了重要的样板代码 - 没有 json.Unmarshal、外部验证库或自定义错误处理。


为什么 Fuego 脱颖而出

  1. 原生 Go 感觉: 与大量包裹 net/http 的框架不同,Fuego 感觉非常原生。它直接利用 net/http,允许标准中间件和处理程序的无缝集成。我重复使用了现有的身份验证中间件,没有出现任何问题。

  2. 自动 OpenAPI 生成: 我以前管理单独的 YAML 文件或依赖 OpenAPI 规范的注释,这是一个乏味且容易出错的过程。 Fuego 自动根据路由处理程序类型生成规范,确保文档始终保持最新状态。

  3. 验证和错误处理:集成验证(使用go-playground/validator)非常直观,并且简化了错误处理。无效的 UserInput 结构会导致符合 RFC 标准的结构化错误消息。


数据转换

为了确保所有传入的 Name 字段均为小写,我利用了 Fuego 的 InTransform 方法:

package main

import "github.com/go-fuego/fuego"

func main() {
    s := fuego.NewServer()
    fuego.Get(s, "/", func(c fuego.ContextNoBody) (string, error) {
        return "Hello, World!", nil
    })
    s.Run()
}
登录后复制
登录后复制

这会在到达路由处理程序之前自动转换数据。


遇到的挑战

  1. 较小的生态系统:与 Gin 或 Echo 相比,Fuego 的用户群较小,导致可用的社区资源较少。然而,事实证明,存储库的示例和文档已经足够了。

  2. 有限的内置中间件:虽然 Fuego 提供了一些中间件,但它并不像一些旧框架那么广泛。 net/http 允许使用外部库或自定义中间件的兼容性。


结论

Fuego 提供了便利性和灵活性之间令人信服的平衡。 它通过内置验证、序列化和文档生成加速 API 开发,同时保持 Go 的原则。 使用类型化结构并让 Fuego 管理其余部分显着改善了我的工作流程。

主要优点:

  • 提高生产力:更清晰的代码和减少样板文件。
  • 自动化文档:始终保持最新的 OpenAPI 规范。
  • 平滑过渡:与现有的net/http处理程序轻松集成。

如果您正在寻找一个现代、灵活的 Go 框架,特别是如果您厌倦了手动 OpenAPI 维护,我强烈推荐 Fuego。它简化了我的开发过程,同时忠于 Go 的极简主义哲学。 GitHub 存储库提供了全面的信息和有前景的路线图。我对它的未来充满热情,并将继续在未来的项目中使用它。

以上是根据我使用 Fuego 的经验,我是如何编写 Go API 的的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Debian OpenSSL有哪些漏洞 Debian OpenSSL有哪些漏洞 Apr 02, 2025 am 07:30 AM

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

从前端转型后端开发,学习Java还是Golang更有前景? 从前端转型后端开发,学习Java还是Golang更有前景? Apr 02, 2025 am 09:12 AM

后端学习路径:从前端转型到后端的探索之旅作为一名从前端开发转型的后端初学者,你已经有了nodejs的基础,...

Go语言中用于浮点数运算的库有哪些? Go语言中用于浮点数运算的库有哪些? Apr 02, 2025 pm 02:06 PM

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go的爬虫Colly中Queue线程的问题是什么? Go的爬虫Colly中Queue线程的问题是什么? Apr 02, 2025 pm 02:09 PM

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

Beego ORM中如何指定模型关联的数据库? Beego ORM中如何指定模型关联的数据库? Apr 02, 2025 pm 03:54 PM

在BeegoORM框架下,如何指定模型关联的数据库?许多Beego项目需要同时操作多个数据库。当使用Beego...

在 Go 语言中,为什么使用 Println 和 string() 函数打印字符串会出现不同的效果? 在 Go 语言中,为什么使用 Println 和 string() 函数打印字符串会出现不同的效果? Apr 02, 2025 pm 02:03 PM

Go语言中字符串打印的区别:使用Println与string()函数的效果差异在Go...

在Go语言中使用Redis Stream实现消息队列时,如何解决user_id类型转换问题? 在Go语言中使用Redis Stream实现消息队列时,如何解决user_id类型转换问题? Apr 02, 2025 pm 04:54 PM

Go语言中使用RedisStream实现消息队列时类型转换问题在使用Go语言与Redis...

GoLand中自定义结构体标签不显示怎么办? GoLand中自定义结构体标签不显示怎么办? Apr 02, 2025 pm 05:09 PM

GoLand中自定义结构体标签不显示怎么办?在使用GoLand进行Go语言开发时,很多开发者会遇到自定义结构体标签在�...

See all articles