软文网站模板网站建设陆金手指下拉壹玖

news/2025/9/22 19:41:03/文章来源:
软文网站模板,网站建设陆金手指下拉壹玖,广州网站建设公司小程序,商品展示软件提示#xff1a; 所有体系课见专栏#xff1a;Go 项目开发极速入门实战课#xff1b;欢迎加入我的训练营#xff1a;云原生AI实战营#xff0c;一个助力 Go 开发者在 AI 时代建立技术竞争力的实战营#xff1b;本节课最终源码位于 fastgo 项目的 feature/s14 分支#x… 提示 所有体系课见专栏Go 项目开发极速入门实战课欢迎加入我的训练营云原生AI实战营一个助力 Go 开发者在 AI 时代建立技术竞争力的实战营本节课最终源码位于 fastgo 项目的 feature/s14 分支更详细的课程版本见Go 项目开发中级实战课27 | 业务实现4实现 Handler 层代码 fastgo 三层简洁架构开发的最后一步便是开发 Handler 层代码。Handler 层代码的实现思路和 Biz 层、Store 层保持一致。 Handler 实现 要实现 Handler主要分为以下几步 实现创建 Handler 层实例的方法实现用户相关 Handler 方法对请求参数进行校验初始化 Handler。 步骤 1实现创建 Handler 层实例的方法 HTTP API 接口最终的逻辑是由 Handler 方法来实现的。所以需要先实现 Handler 方法。 fastgo 项目的 Handler 层代码位于 internal/apiserver/handler/ 目录中。新建一个 Handler 结构体该结构体包含了 fg-apiserver 的路由函数。代码位于 internal/apiserver/handler/handler.go 文件中内容如下 package handlerimport (github.com/onexstack/fastgo/internal/apiserver/biz )// Handler 处理博客模块的请求. type Handler struct {biz biz.IBiz }// NewHandler 创建新的 Handler 实例. func NewHandler(biz biz.IBiz) *Handler {return Handler{biz: biz,} }Handler 结构体中包含了 Biz 层的 IBiz 接口IBiz 接口中包含的方法用来执行具体的业务逻辑。: 步骤 2 实现用户相关 Handler 方法 internal/apiserver/handler/user.go 文件中包含了用户相关的 Handler 方法。这些 Handler 方法的实现逻辑保持一致。实现逻辑如下 这里我介绍下 CreateUser 路由方法的实现其他路由实现方法类似。CreateUser 路由方法代码如下 // CreateUser 创建新用户. func (h *Handler) CreateUser(c *gin.Context) {slog.Info(Create user function called)var rq v1.CreateUserRequestif err : c.ShouldBindJSON(rq); err ! nil {core.WriteResponse(c, errorsx.ErrBind, nil)return}if err : validation.ValidateCreateUserRequest(c.Request.Context(), rq); err ! nil {core.WriteResponse(c, errorsx.ErrInvalidArgument.WithMessage(err.Error()), nil)return}resp, err : h.biz.UserV1().Create(c.Request.Context(), rq)if err ! nil {core.WriteResponse(c, err, nil)return}core.WriteResponse(c, nil, resp) }首先调用 c.ShouldBindJSON 方法将请求中的参数解析到 v1.CreateUserRequest 类型的变量 rq 中。如果解析失败返回 errorsx.ErrBind 类型的自定义错误。 接着调用 validation.ValidateCreateUserRequest 函数对请求参数进行校验。为了统一管理请求参数的校验方法提高代码可维护性。将校验方法统一放在 validation位于 internal/apiserver/pkg/validation 目录中。如果校验失败返回 errorsx.ErrInvalidArgument 类型的自定义错误。这里要注意传递的 context 是 c.Request.Context()而不是 *gin.Context 类型的变量 c。因为 c中缺少了一些 HTTP 请求上下文信息。 接着调用 Biz 层的方法 h.biz.UserV1().Create 执行具体的业务逻辑。 gin.Context 结构体类型提供了以下方法分别用来绑定不同位置的请求参数到结构体 ShouldBindJSONShouldBindUri将请求中的路径参数绑定到 Go 结构体中的对应字段上这些字段跟路径参数的映射关系是通过 Go 结构体字段的 uri 标签来映射的XXXX 步骤 3对请求参数进行校验 首先创建一个校验类型的结构体 Validator代码位于 internal/apiserver/pkg/validation/validation.go 文件中内容如下 // Validator 是验证逻辑的实现结构体. type Validator struct {// 有些复杂的验证逻辑可能需要直接查询数据库// 这里只是一个举例如果验证时有其他依赖的客户端/服务/资源等// 都可以一并注入进来store store.IStore }// NewValidator 创建一个新的 Validator 实例. func NewValidator(store store.IStore) *Validator {return Validator{store: store} }在 Validator 结构体中可以添加校验逻辑中依赖的依赖项。例如 store.IStore 类型的实例第三方微服务客户端等。以此实现更加复杂的校验逻辑。 ValidateCreateUserRequest 方法实现如下 func (v *Validator) ValidateCreateUserRequest(ctx context.Context, rq *v1.CreateUserRequest) error {// Validate usernameif rq.Username {return errors.New(Username cannot be empty)}if len(rq.Username) 4 || len(rq.Username) 32 {return errors.New(Username must be between 4 and 32 characters)}// Username can only contain letters, numbers, and underscoresusernameRegex : regexp.MustCompile(^[a-zA-Z0-9_]$)if !usernameRegex.MatchString(rq.Username) {return errors.New(Username can only contain letters, numbers, and underscores)}// Validate passwordif rq.Password {return errors.New(Password cannot be empty)}if len(rq.Password) 8 || len(rq.Password) 64 {return errors.New(Password must be between 8 and 64 characters)}// Validate password complexity (must contain at least one letter and one number)passwordRegex : regexp.MustCompile(^.*(?.*[a-zA-Z])(?.*\d).*$)if !passwordRegex.MatchString(rq.Password) {return errors.New(Password must contain at least one letter and one number)}// Validate nickname (if provided)if rq.Nickname ! nil *rq.Nickname ! {if len(*rq.Nickname) 32 {return errors.New(Nickname cannot exceed 32 characters)}}// Validate emailif rq.Email {return errors.New(Email cannot be empty)}emailRegex : regexp.MustCompile(^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$)if !emailRegex.MatchString(rq.Email) {return errors.New(Invalid email format)}// Validate phone numberif rq.Phone {return errors.New(Phone number cannot be empty)}// Validate Chinese mainland phone number format (11 digits starting with 1)phoneRegex : regexp.MustCompile(^1\d{10}$)if !phoneRegex.MatchString(rq.Phone) {return errors.New(Invalid phone number format, must be 11 digits starting with 1)}return nil }上述校验逻辑代码比较简单这里不再介绍。为了提高代码的可维护性将用户相关的校验方法统一保存在 internal/apiserver/pkg/validation/user.go 文件中。user.go 文件中只实现了 v1.CreateUserRequest 请求结构体的校验逻辑。 v1.UpdateUserRequest 等其他请求结构体的校验代码实现留个作业由你来实现。 步骤 4初始化 Handler 修改 internal/apiserver/server.go 文件添加以下代码 package apiserverimport (...github.com/onexstack/fastgo/internal/apiserver/bizgithub.com/onexstack/fastgo/internal/apiserver/handlergithub.com/onexstack/fastgo/internal/apiserver/pkg/validationgithub.com/onexstack/fastgo/internal/apiserver/store... ) ... // NewServer 根据配置创建服务器. func (cfg *Config) NewServer() (*Server, error) {...// 初始化数据库连接db, err : cfg.MySQLOptions.NewDB()if err ! nil {return nil, err}store : store.NewStore(db)cfg.InstallRESTAPI(engine, store)... }在 NewServer 方法中通过调用 cfg.MySQLOptions.NewDB() 创建了一个 *gorm.DB 的实例 db再使用 db 创建了 store.IStore 的实例 store。 将路由安装代码在 cfg.InstallRESTAPI 方法中实现这样可以使 NewServer 更加简洁同时也便于统一维护路由设置。 cfg.InstallRESTAPI 方法实现如下 // 注册 API 路由。路由的路径和 HTTP 方法严格遵循 REST 规范. func (cfg *Config) InstallRESTAPI(engine *gin.Engine, store store.IStore) {...// 创建核心业务处理器handler : handler.NewHandler(biz.NewBiz(store), validation.NewValidator(store))authMiddlewares : []gin.HandlerFunc{}// 注册 v1 版本 API 路由分组v1 : engine.Group(/v1){// 用户相关路由userv1 : v1.Group(/users){// 创建用户。这里要注意创建用户是不用进行认证和授权的userv1.POST(, handler.CreateUser)userv1.PUT(:userID, handler.UpdateUser) // 更新用户信息userv1.DELETE(:userID, handler.DeleteUser) // 删除用户userv1.GET(:userID, handler.GetUser) // 查询用户详情userv1.GET(, handler.ListUser) // 查询用户列表.}// 博客相关路由postv1 : v1.Group(/posts, authMiddlewares...){postv1.POST(, handler.CreatePost) // 创建博客postv1.PUT(:postID, handler.UpdatePost) // 更新博客postv1.DELETE(, handler.DeletePost) // 删除博客postv1.GET(:postID, handler.GetPost) // 查询博客详情postv1.GET(, handler.ListPost) // 查询博客列表}} }在 InstallRESTAPI 方法中通过 handler.NewHandler 函数创建了 Handler 层的实例。并使用 Handler 的实例 handler 提供的路由方法来设置 HTTP 路由。 创建 handler 实例依赖 biz.IBiz、*validation.Validator 类型的实例。上述实例分别通过 biz.NewBiz(store)、validation.NewValidator(store) 函数来创建。 上述代码使用 Gin 框架提供的各类路由注册方法注册了符合 REST 规范的 HTTP 路由。Gin 框架如何注册路由请阅读 Gin GitHub 项目仓库的 README 文件。上述代码注册的 HTTP 路由见 下表所示。 HTTP 路由HTTP 方法 HTTP 路径路由描述GET /healthz健康检查接口POST /v1/users创建用户PUT /v1/users/:userID更新用户信息DELETE /v1/users/:userID删除用户GET /v1/users/:userID获取用户信息GET /v1/users列出所有用户POST /v1/posts创建文章PUT /v1/posts/:postID更新文章DELETE /v1/posts删除文章GET /v1/posts/:postID获取文章信息GET /v1/posts列出所有文章 编译并测试 执行以下命令重新编译并运行 fg-apiserver $ ./build.sh $ _output/fg-apiserver -c configs/fg-apiserver.yaml打开另一个 Linux 终端执行以下命令测试 HTTP 接口是否正常工作 $ curl -XPOST -HContent-Type: application/json http://127.0.0.1:6666/v1/users -d {username:colin,password:fastgo1234,nickname:belm,email:nosbelmqq.com,phone:1818888xxxx} {userID:user-gxqfqn}上述命令创建了一个新的用户并返回了 用户 ID user-gxqfqn。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各大网站免费观看优化大师软件大全

Java异常详解 异常分类1.Throwable2. Error(错误)3. Exception(异常)3.1 运行时异常 RuntimeException3.2 编译时异常(受检查异常)ClassNotFoundException + IOException4.常见的运行时异常5.异常如何处理Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、…

昆明做网站建设价位wordpress 做分销

一、platform总线、设备与驱动 在Linux 2.6 的设备驱动模型中,关心总线、设备和驱动3个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,…

论坛备案 和网站备案最佳品牌营销策划公司

猫脸码客作为一个专注于开源数据集分享的公众号,致力于为广大用户提供丰富、优质的数据资源。我们精心筛选和整理各类开源数据集,涵盖机器学习、深度学习、自然语言处理等多个领域,以满足不同用户的需求。 (https://img-blog.csdnimg.cn/d98…

app网站建设济宁下面哪一项不属于网络营销方式

// 去掉数组中的空数据 for (let i 0; i < arr.length; i) {if (arr[i] null || arr[i] undefined || arr[i] "") {arr.splice(i, 1);i--;} }

有哪些好的做问卷调查的网站电商设计师常用的网站

引言 最近在学习Mybatis Plus的使用&#xff0c;希望通过spring boot快速将mybatis plus整合进来。 对于springboot项目&#xff0c;mybatis plus团队也有自己的启动器 &#xff1a;mybatis-plus-boot-starter。这个依赖内部已经整合了mybatis-spring&#xff0c;也包括非快速…

2025年录音转文字技术解析与实用工具评测 - 指南

2025年录音转文字技术解析与实用工具评测 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

CF2147H Maxflow GCD Coloring 题解

Description 给定一个无向图 \(G\),它有 \(n\) 个顶点,每条边上有一个正整数容量。我们记 \(\textsf{maxflow}(u,v)\) 为图中从源点 \(u\) 到汇点 \(v\) 的最大流值。 我们称图 \(G\) 是 好图,如果存在一个整数 \(d…

详细介绍:深入理解 JVM 字节码文件:从组成结构到 Arthas 工具实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

免费做网站优化网站建设需要费用

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 人脸检测 4.2 局部区域选择 4.3 特征提取 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .........................................…

借助S参数测量评估电容器阻抗第 2 部分

借助S参数测量评估电容器阻抗第 2 部分2025-09-22 19:37 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !…

诸城建设局网站郑州seo优化

为什么80%的码农都做不了架构师&#xff1f;>>> find / -name httpd.conf find / -name access_log 2>/dev/null find /etc -name *srm* find / -amin -10 # 查找在系统中最后10分钟访问的文件 find / -atime -2 # 查找在系统中最后48小时访问的文件 find / -mm…

网站管理设置湖州网站开发公司

解决办法&#xff1a; What solved was to go to Navigate > Reveal in Project Navigator . After this, the structure appeared again.

代做企业网站备案wordpress可视化模板编辑器

简介 本来宏哥一开始打算用真机做的&#xff0c;所以在前边搭建环境时候就没有下载SDK&#xff0c;但是由于许多小伙伴通过博客发短消息给宏哥留言说是没有真机&#xff0c;所以顺应民意整理一下模拟器&#xff0c;毕竟“得民心者&#xff0c;得天下”。SDK顾名思义&#xff0c…

瑞安做微网站平台公司信用评级

逆矩阵&#xff1a;解开线性代数之谜的魔法钥匙 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一同深入探讨线性代数中的重要主题——逆矩阵…

天津品牌网站建设好处网站 建设 领导小组

计算机文件基本上分为二种&#xff1a;二进制文件和 ASCII&#xff08;也称纯文本文件&#xff09;。图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序阅读的简单文本文件&#xff0c;由一些字符的…

网站设计公司种类付费网站怎么做

目录: Java工具类&#xff1a;日期工具类文件上传工具类 短信工具类验证码工具类邮件工具类代码生成器 (SSM)各种依赖的作用&#xff1a;spring-context 依赖&#xff1a;spring-context-supprt 依赖&#xff1a;spring-tx 依赖:mysql-connector-java 依赖&#xff1a;spring-j…

提供常州网站建设俄罗斯的最新军事新闻

架构 先简单介绍zabbix监控的最主要的两个组件&#xff1a; zabbix server zabbix agent server 用来部署 web console以及相关的数据存储&#xff0c;所以需要配合一些数据库来保存数据&#xff0c;比如mysql,pgsql, 又有前端的页面所以还需要配置 nginx 和getway 所以 serve…

个人网站做联盟营销中山技术支持中山网站建设

代码分析 引入tkinter库&#xff0c;并从中导入messagebox模块。 read_users()函数用于读取存储用户信息的文本文件"users.txt"。它打开文件并逐行读取&#xff0c;将每行的用户名和密码以空格分隔后存储在一个列表中&#xff0c;最后返回该列表。 login(username,…

Uiverse.io 2.0 震撼发布:新增 3000+ 动效组件!适配 React、Vue

Uiverse官网https://uiverse.io/elements本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/p/19105896

问题及解决方法

语法基础问题 问题:变量作用域、数据类型转换、运算符优先级混淆。 解决:多写代码验证,比如用System.out.println()输出不同运算结果,对比预期和实际值。 面向对象概念模糊 问题:类与对象的关系、封装 / 继承 / 多…