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

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

Linda Hamilton
发布: 2025-01-10 08:37:42
原创
425 人浏览过

How I write Go APIs in  my experience with Fuego

我使用 Fuego 构建 Go API 的经验

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

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


第一印象

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

<code class="language-go">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()
}</code>
登录后复制
登录后复制

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


现实世界的例子

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

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

<code class="language-go">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
}</code>
登录后复制

主要改进:

  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 方法:

<code class="language-go">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()
}</code>
登录后复制
登录后复制

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


遇到的挑战

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

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


结论

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

主要优点:

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

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

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板