当前位置: 首页 > news >正文

在 Go 应用中 如何像 FastAPI 一样优雅地构建控制器

文章精选推荐

1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
6 Ai assistant ,又是一个写代码神器

文章正文

go-rest-kit 是一个基于 Go 语言和 Gin 框架的快速构建 RESTful API 的工具库,它提供了一套方便的工具,使得开发者能够更加高效地构建 API,避免重复编写大量的代码,特别是在处理控制器、路由、请求验证和错误处理等方面。

该库的设计灵感部分来源于 Python 的 FastAPI,并且为 Go 开发者提供了类似的便捷体验。你可以通过更简洁的方式定义控制器、处理请求和响应,而不需要手动编写大量冗余代码。

1. 安装 go-rest-kit

你首先需要安装 go-rest-kit,可以通过 go get 来安装:

go get github.com/goharbor/go-rest-kit

2. 基本的用法

go-rest-kit 中,核心功能包括控制器(Controller)、请求和响应的结构体定义、路由注册、验证请求数据等。接下来我将通过一个简单的例子展示如何使用 go-rest-kit 来快速构建一个 RESTful API。

2.1 初始化项目

首先,你需要安装 Gin 和 go-rest-kit

go get github.com/gin-gonic/gin
go get github.com/goharbor/go-rest-kit
2.2 创建控制器

go-rest-kit 中,控制器可以通过定义结构体并用特定标签标注来简化 API 的开发。你可以将这些结构体视为 FastAPI 中的“路径操作函数”。例如,定义一个处理用户的控制器,提供简单的用户信息查询功能。

package controllersimport ("github.com/gin-gonic/gin""github.com/goharbor/go-rest-kit""net/http"
)// UserController 定义了一个用户控制器
type UserController struct {restkit.BaseController
}// GetUser 定义了一个获取用户信息的 API 路由
// 通过结构体标签直接绑定请求参数
func (u *UserController) GetUser(c *gin.Context) {userID := c.Param("user_id")// 假设从数据库或其他地方获取用户信息user := map[string]interface{}{"id":   userID,"name": "John Doe","age":  30,}c.JSON(http.StatusOK, user)
}
2.3 注册控制器和路由

通过 go-rest-kit,你可以快速注册控制器并定义路由,避免了手动绑定每个路由的繁琐操作。你只需将控制器实例化并注册到 restkit.Router 中。

package mainimport ("github.com/gin-gonic/gin""github.com/goharbor/go-rest-kit""github.com/yourusername/yourproject/controllers"
)func main() {r := gin.Default()// 初始化 RestKit 路由restKit := restkit.NewRouter(r)// 注册 UserControlleruserController := &controllers.UserController{}restKit.AddController(userController)// 启动服务r.Run(":8080")
}

3. 请求数据验证

go-rest-kit 通过结构体标签的方式简化了请求数据的验证。例如,定义一个请求体结构体并绑定到控制器的函数中,自动进行参数校验和绑定。

package controllersimport ("github.com/gin-gonic/gin""github.com/goharbor/go-rest-kit""net/http""github.com/go-playground/validator/v10"
)type CreateUserRequest struct {Name  string `json:"name" binding:"required"`Email string `json:"email" binding:"required,email"`Age   int    `json:"age" binding:"required,min=18"`
}type UserController struct {restkit.BaseController
}func (u *UserController) CreateUser(c *gin.Context) {var request CreateUserRequest// 自动绑定请求数据并验证if err := c.ShouldBindJSON(&request); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// 假设数据插入成功c.JSON(http.StatusOK, gin.H{"message": "User created successfully","user":    request,})
}

在上面的代码中,CreateUserRequest 结构体使用了 binding 标签来进行参数验证,Go 语言的 validator 库会自动校验字段是否合法。

3.1 请求验证说明

go-rest-kit 的请求验证是基于 go-playground/validator 库的,提供了一些常见的验证功能,如:

  • required:字段必填
  • email:邮箱格式验证
  • minmax:数字或字符串的最小/最大值验证

你可以根据自己的需求自定义更多的验证规则。

3.2 返回响应

go-rest-kit 还提供了简化的响应处理机制。在上面的 CreateUser 函数中,我们使用了 c.JSON 方法来返回 JSON 格式的响应。

你还可以使用 c.JSON 来返回自定义状态码和数据,或者返回一个错误响应。

4. 错误处理

go-rest-kit 提供了一个统一的错误处理机制。你可以通过继承 BaseController 类来处理所有的错误。

例如:

package controllersimport ("github.com/gin-gonic/gin""github.com/goharbor/go-rest-kit""net/http"
)type UserController struct {restkit.BaseController
}func (u *UserController) GetUser(c *gin.Context) {userID := c.Param("user_id")if userID == "" {u.HandleError(c, http.StatusBadRequest, "User ID is required")return}// 处理逻辑并返回数据c.JSON(http.StatusOK, gin.H{"user_id": userID,"name":    "John Doe","email":   "johndoe@example.com",})
}

在上面的代码中,HandleError 方法用于统一的错误处理,返回详细的错误信息。

5. 支持自定义中间件

你还可以为 API 添加中间件来处理认证、日志记录等功能。go-rest-kit 提供了内建的支持,允许你通过 AddMiddleware 方法注册自定义的中间件。

例如,添加一个简单的认证中间件:

package mainimport ("github.com/gin-gonic/gin""github.com/goharbor/go-rest-kit""net/http"
)func AuthMiddleware() gin.HandlerFunc {return func(c *gin.Context) {authHeader := c.GetHeader("Authorization")if authHeader != "Bearer my-token" {c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})c.Abort()return}c.Next()}
}func main() {r := gin.Default()restKit := restkit.NewRouter(r)// 注册中间件r.Use(AuthMiddleware())// 添加控制器userController := &controllers.UserController{}restKit.AddController(userController)// 启动服务器r.Run(":8080")
}

6. 总结

通过 go-rest-kit,你可以快速构建基于 Gin 的 RESTful API,免去手动处理路由、验证、错误处理等繁琐工作。它为开发者提供了一个简洁、统一的 API 开发模式,通过控制器和结构体的方式快速定义和处理请求,使得代码更加简洁和可维护。

如果你的项目需要频繁处理复杂的请求和响应,go-rest-kit 是一个很好的选择,尤其是在你希望快速构建高效 RESTful API 时。

相关文章:

在 Go 应用中 如何像 FastAPI 一样优雅地构建控制器

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...

用户界面的UML建模11

然而,在用户界面方面,重要的是要了解《boundary》类是如何与这个异常分层结构进行关联的。 《exception》类的对象可以作为《control》类的对象。因此,《exception》类能够聚合《boundary》类。 参见图12,《exception》Database…...

历代iPhone运行内存大小和电池容量信息

系列设备名称充电端口标配充电线PD快充无线充电 (W)标配充电器电池容量 (mAh)发布时间RAM运存iPhone 16iPhone 16 Pro MaxUSB Type-CUSB-C to USB-C支持25无47472024/9/108GB LPDDR5XiPhone 16 ProUSB Type-CUSB-C to USB-C支持25无35772024/9/108GB LPDDR5XiPhone 16 PlusUSB …...

计算机网络之---物理层设备

什么是物理层设备 物理层设备是指负责数据在物理媒介上传输的硬件设备,它们主要处理数据的转换、信号的传输与接收,而不涉及数据的内容或意义。常见的物理层设备包括网卡、集线器、光纤收发器、调制解调器等。 物理层设备有哪些 1、网卡(N…...

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景 实现效果 该案例实现了使用Three.js创建一个带有聚光灯和旋转立方体的3D场景。 知识点 WebGLRenderer(WebGL渲染器) THREE.WebGLRenderer 是 Three.js 中用于将场景渲染为 WebGL 内容的核…...

第八讲 一元函数积分学的概念和性质

不定积分 1.原函数与不定积分 需知道:F(X)可导必连续 2.原函数(不定积分)存在定理 (1)连续函数f(x)必有原函数F(x) (2)含有第一类间断点和无穷间断点的函数f(x)在包含该间断点的区间内必没有原函数F(x). 速记:只有震荡可能有…...

ADMM原理及应用

文章目录 1. ADMM原理1.1. 数学形式1.2. 传统“乘子法”和它的不足1.3. ADMM 的核心思想:分步做1.4. Scaled Form of ADMM1.5. 迭代过程中主要检查的两大残差1.6. 怎么设置停止准则(Stopping Criteria)?1.7. 自适应调整罚参数 ρ \rho ρ(又…...

mysql之sql的优化方案(重点)

1、全字段匹配是最棒的 假如一个Staffs 这个表,将 name,age ,pos 组合成了一个联合索引,在where条件下,能够使用到的索引越多越好。 EXPLAIN SELECT * FROM staffs WHERE NAME July; EXPLAIN SELECT * FROM staffs WHERE NAME July AND age…...

【LeetCode】303. 区域和检索 - 数组不可变

目录 描述Python1. 前缀和 描述 给定一个整数数组nums&#xff0c;处理以下类型的多个查询&#xff1a;计算索引left和right&#xff08;包含left和right&#xff09;之间的nums元素的 和 &#xff0c;其中left < right 实现NumArray类&#xff1a; NumArray(int[] nums)&a…...

前端开发 vue 中如何实现 u-form 多个form表单同时校验

在 Vue 项目中使用 UView UI 的 u-form 组件时&#xff0c;多个表单同时校验的需求非常常见。例如&#xff0c;当我们有多个表单需要在同一个页面中进行校验并提交时&#xff0c;我们需要确保每个表单都能进行单独验证&#xff0c;同时可以在同一时刻进行批量验证。 接下来&am…...

【网络】什么是速率 (Rate)带宽 (Bandwidth)吞吐量 (Throughput)?

注意单位&#xff1a; 在 kbps、Mbps、Gbps 中&#xff0c;前面的 k、M、G 是 国际单位制(SI) 的前缀&#xff0c;表示不同的数量级&#xff1a; k&#xff08;千/kilo&#xff09;: (10^3 1,000) kbps&#xff08;kilobits per second&#xff09;: 每秒 1,000 位&#xff08…...

(leetcode算法题)769. 最多能完成排序的块

Q1. 是否能用贪心算法&#xff1f;为什么&#xff1f; 先预设一个策略&#xff0c;每当当前的nums[i]满足可以 "成块"&#xff0c;就直接让这个数成块&#xff0c;也就是说之后的遍历过程中不会将这个数在考虑到自己的块内&#xff0c; "成块" 是指只要只…...

高光谱相机的特点

光谱特性 高光谱分辨率&#xff1a;能将光谱范围分割成极窄的波段&#xff0c;光谱分辨率通常达到纳米级甚至亚纳米级&#xff0c;可精确捕捉到不同物质在细微光谱差异上的特征&#xff0c;比如可以区分不同种类的植被因叶绿素含量等差异而在光谱上的细微变化。 多波段探测&a…...

《Spring Framework实战》8:4.1.3.Bean 概述

欢迎观看《Spring Framework实战》视频教程 Spring IoC 容器管理一个或多个 bean。这些 bean 是使用 您提供给容器的配置元数据&#xff08;例如&#xff0c;以 XML <bean/>定义的形式&#xff09;。 在容器本身中&#xff0c;这些 bean 定义表示为BeanDefinition对象&a…...

BGP的local_preference本地优先级属性

一、BGP的local preference属性简介 1、local preference公认任意属性 当一条BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由属性进行比较&#xff0c;从而筛选出最佳到达目标网络的通达路径。本地优先属性&#xff0c;只在IBGP对等体之间…...

IP地址与端口号

ip地址与端口号 IP地址和端口号是网络通信中的两个重要概念&#xff0c;它们共同构成了网络通信的基础。 IP地址&#xff1a;网络世界的门牌号 定义&#xff1a;IP地址&#xff08;Internet Protocol Address&#xff09;是分配给网络设备的数字标签&#xff0c;用于在计算机网…...

Fastapi + vue3 自动化测试平台(2)--日志中间件

FastAPI Vue3 自动化测试平台&#xff08;2&#xff09;-- 日志中间件 前言 在开发和运行自动化测试平台时&#xff0c;日志功能是至关重要的一部分。日志不仅能帮助我们快速定位和解决问题&#xff0c;还能作为平台运行的记录依据&#xff0c;为后续分析和优化提供参考。 …...

iOS - AutoreleasePool

1. 基本数据结构 // AutoreleasePool 的基本结构 struct AutoreleasePoolPage {static pthread_key_t const key AUTORELEASE_POOL_KEY;magic_t const magic;id *next; // 指向下一个可存放对象的地址pthread_t const thread; // 所属线程AutoreleasePoolPage …...

1.CSS的复合选择器

1.1 什么是复合选择器 在CSS中&#xff0c;可以根据选择器的类型把选择器分为基础选择器和复合选择器&#xff0c;复合选择器是建立在基础选择器之上&#xff0c;对基础选择器进行组合形成的。 复合选择器可以更精准、更高效的选择目标元素&#xff08;标签&#xff09; 复…...

优质内容在个人IP运营中的重要性:以开源AI智能名片商城小程序为应用实例的深度探讨

摘要&#xff1a;在数字化时代&#xff0c;个人品牌&#xff08;IP&#xff09;的塑造与传播已成为各行各业提升影响力、吸引用户关注、促进商业转化的关键策略。优质内容作为连接个人IP与目标受众的桥梁&#xff0c;其在个人IP运营中的重要性不言而喻。本文旨在深入探讨优质内…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...