首页 >后端开发 >Golang >Go 中的计算器后端 API

Go 中的计算器后端 API

Barbara Streisand
Barbara Streisand原创
2024-12-05 08:14:10358浏览

再次回来另一个迷你项目,这次是用 Go 编写的计算器后端 API 工具!

我最近完成了一个为无状态计算器构建 HTTP JSON API 的项目,让我告诉你——它比我预期的有趣得多(也更具挑战性)。从表面上看,这可能听起来很简单:“嘿,这只是一个计算器,对吧?”但一旦你深入研究,你就会开始发现使 API 真正适合生产的所有细节。

所以,让我分享一下这个过程、吸取的教训,以及如果我必须再做一次的话我会调整什么。

~ 源代码:在这里找到

无状态计算器 API

任务很简单:为不存储任何数据的计算器构建一个 API——没有数据库,没有内存缓存。每个计算都是孤立发生的。无国籍。干净的。简单的。该 API 遵循 OpenAPI 规范,该规范列出了所有端点和预期行为。

接下来怎么办?

输入验证

我学到的第一个教训就是输入验证的重要性。你不能信任用户,即使是像数学这样基本的东西。例如:

如果有人发送非号码会怎样?繁荣。
除以零怎么样?双重繁荣。

为了解决这个问题,我确保在 API 考虑处理每个输入之前都对其进行了清理和验证。如果出现问题,用户会收到一条有用且友好的错误消息,例如:

{
  "error": "Division by zero is not allowed. Please provide a valid denominator."
}

没有人喜欢神秘的“500 服务器错误”消息。

调试日志

你知道这句话吗?“原木是你最好的朋友”?这是真的。我使用 Go golang.org/x/exp/slog 包实现了结构化日志记录,它节省了我很多时间。每个请求都记录有详细信息,例如:

  • 请求路径
  • 用户的IP地址
  • 状态代码
  • 出现的任何错误

这是我如何设置文本日志的片段:

logger := slog.New(slog.NewTextHandler(os.Stdout, nil))

或者 JSON 日志(非常适合与监控工具集成):

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

当某些事情没有按预期工作时,拥有这些日志可以让调试变得轻而易举。

CORS:意想不到的英雄

Calculator Backend-API In Go

我最初并没有计划在基于浏览器的应用程序中使用这个 API,但随着项目的发展,很明显 CORS(跨源资源共享)是必要的。

使用 github.com/rs/cors 包,我快速添加了所需的标头,以允许基于浏览器的客户端与 API 交互。

{
  "error": "Division by zero is not allowed. Please provide a valid denominator."
}

我的主要包

1) net/http:Go 的标准库,用于设置 HTTP 服务器和路由请求。
2)encoding/json:处理请求和响应的JSON编码/解码。
3) golang.org/x/exp/slog:用于以文本或 JSON 格式记录每个请求。
4) github.com/rs/cors:处理 Web 集成的跨域请求。

计算逻辑又如何呢?

我为这些计算制作了一些处理程序,它们本质上非常基本,主要关注计算的核心功能(加法、减法、除法和乘法)。

logger := slog.New(slog.NewTextHandler(os.Stdout, nil))

除此之外,使用著名的 net/http 包处理我的 HTTP 请求非常简单,并且有许多以不同方式执行此操作的示例。我的情况非常简单,我只需要提供一些 HTTP,处理响应编写器和请求。

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

以下是一些用例示例:

c := cors.New(cors.Options{
        AllowedOrigins:   []string{"*"},
        AllowedMethods:   []string{"GET", "POST", "OPTIONS"},
        AllowedHeaders:   []string{"Content-Type"},
        AllowCredentials: true,
    })

请求:

//handlers.go

func AddHandler(logger *slog.Logger) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        handleOperation(logger, w, r, func(a, b float64) float64 { return a + b })
    }
}

func SubtractHandler(logger *slog.Logger) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        handleOperation(logger, w, r, func(a, b float64) float64 { return a - b })
    }
}

func MultiplyHandler(logger *slog.Logger) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        handleOperation(logger, w, r, func(a, b float64) float64 { return a * b })
    }
}

func DivideHandler(logger *slog.Logger) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        handleOperation(logger, w, r, func(a, b float64) float64 {
            if b == 0 {
                panic("division by zero")
            }
            return a / b
        })
    }
}

结论

是的!差不多就这样了!这是一个我喜欢的快速而有趣的迷你项目!请随意尝试并以您想要的方式改进和增强。

下次再见,干杯! ? ?

以上是Go 中的计算器后端 API的详细内容。更多信息请关注PHP中文网其他相关文章!

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