再次回来另一个迷你项目,这次是用 Go 编写的计算器后端 API 工具!
我最近完成了一个为无状态计算器构建 HTTP JSON 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 包实现了结构化日志记录,它节省了我很多时间。每个请求都记录有详细信息,例如:
这是我如何设置文本日志的片段:
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
或者 JSON 日志(非常适合与监控工具集成):
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
当某些事情没有按预期工作时,拥有这些日志可以让调试变得轻而易举。
我最初并没有计划在基于浏览器的应用程序中使用这个 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中文网其他相关文章!