Gone框架介绍30 - 使用`goner/gin`提供Web服务

2024-06-23 07:36

本文主要是介绍Gone框架介绍30 - 使用`goner/gin`提供Web服务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

gone是可以高效开发Web服务的Golang依赖注入框架
github地址:https://github.com/gone-io/gone
文档地址:https://goner.fun/zh/

使用goner/gin提供Web服务

文章目录

  • 使用`goner/gin`提供Web服务
    • 注册相关的Goners
    • 编写Controller挂载路由
    • 路由处理函数
      • io.Reader
      • chan any
    • HTTP请求参数注入
    • 配置项
      • 例子,将端口改为 `8000`
      • 更多配置项
      • 更多例子

注册相关的Goners

这里我们编写一个Priest函数,用于注册相关的Goners。

package main
import ("github.com/gone-io/gone""github.com/gone-io/gone/goner"
)// 用于注册Goners的Priest函数
func Priest(cemetery gone.Cemetery) error {//注册gin相关的Goners_ = goner.GinPriest(cemetery)//TODO: 注册其他的Gonersreturn nil
}func main() {// 在main函数中使用Priest函数启动服务gone.Serve(Priest)
}

将上面代码保存为main.go,,代码已经能够正常运行起来了,运行中代码会监听本地8080端口,但是所有的请求都是返回404。

编写Controller挂载路由

为了提供服务,而不只是返回404,我们需要编写一个Controller,挂载路由。
新建文件controller.go,编写如下代码:

// NewController controller 的构造函数
func NewController() gone.Goner {return &controller{}
}type controller struct {gone.Flagroot gone.RouteGroup `gone:"*"` // 根路由组
}func (ctr *controller) Mount() gone.GinMountError {ctr.root.GET("/ping", func() string {return "hello gone"})return nil
}

然后,在main.go文件Priest函数中添加注册Controller的代码:

	//注册Controllercemetery.Bury(NewController())

再次运行代码:go run .,使用curl命令访问localhost:8080/ping,返回{"code":0,"data":"hello gone"}

上面代码中,controller通过实现方法Mount() gone.GinMountError成为gin.Controllergoner/gin启动过程中会自动调用Mount()方法;我们需要再该方法中挂载我们希望处理的路由。

为此,我们需要在controller上添加一个gone.RouteGroup类型的root字段,使用gone:"*"标记为依赖注入;Gone会将代表根路由的gone.RouteGroup装配到root属性上。gone.RouteGroup是一个接口,定义了用于挂载路由的GETPOST等方法,下面是其定义:

type IRoutes interface {Use(...HandlerFunc) IRoutesHandle(string, string, ...HandlerFunc) IRoutesAny(string, ...HandlerFunc) IRoutesGET(string, ...HandlerFunc) IRoutesPOST(string, ...HandlerFunc) IRoutesDELETE(string, ...HandlerFunc) IRoutesPATCH(string, ...HandlerFunc) IRoutesPUT(string, ...HandlerFunc) IRoutesOPTIONS(string, ...HandlerFunc) IRoutesHEAD(string, ...HandlerFunc) IRoutes
}type IRouter interface {IRoutesGetGinRouter() gin.IRouterGroup(string, ...HandlerFunc) RouteGroupLoadHTMLGlob(pattern string)
}// RouteGroup route group, which is a wrapper of gin.RouterGroup, and can be injected for mount router.
type RouteGroup interface {IRouter
}

路由处理函数

通过RouteGroup定义可以看到,GETPOST等用于挂载路由的函数,都可以接收多个HandlerFunc参数。HandlerFunc要求是一个函数,这里称为路由处理函数

路由处理函数,可以接收多个参数,也可以返回多个值;一般返回两个值,一个正常值 和 一个 error 值,如下:

func processRoute(ctx *gin.Context) (string, error) {return "hello gone", nil
}

正常值的类型可以为 golang 的简单类型(int、string、float 等)、结构体、指针、接口、数组、slice、map 等;还可以返回 io.Readerchan any两种特殊类型。

io.Reader

通过io.Reader可以返回任意的数据,比如返回一个文件:

	ctr.root.GET("/file", func() (io.Reader, error) {return os.Open("main.go")})

重启后,用curl测试:curl -o main.go http://localhost:8080/file,可以下载到main.go文件。

特别提醒一下,将http://localhost:8080/file输入到浏览器地址栏并不会触发下载,而是直接显示了文件内容,这是因为返回的是文本内容,并且又缺少触发下载的Header:Content-Disposition

chan any

通过返回chan any,可以方便的实现一个SSE服务。

	type Info struct {Msg   string `json:"msg"`Index int    `json:"index"`}ctr.root.GET("/sse", func() chan any {ch := make(chan any)go func() {defer close(ch) //注意关闭channelfor i := 0; i < 3; i++ {time.Sleep(time.Second)ch <- Info{Index: i,Msg:   "hello gone",}}}()return ch})

Mount 函数中添加上面代码,然后重启服务。使用curl测试:curl http://localhost:8080/sse,可以得到如下输出(每秒收到一个event):

event: data
data: {"msg":"hello gone","index":0}event: data
data: {"msg":"hello gone","index":1}event: data
data: {"msg":"hello gone","index":2}event: done

HTTP请求参数注入

路由处理函数的参数,支持依赖注入。

  1. 支持注册到Gone的Goners类型直接作为参数,例如以gone.Logger类型作为参数:
	ctr.root.GET("inject", func(logger gone.Logger) string {logger.Infof("inject")return "inject"})
  1. 支持以*gin.Context*gone.Context类型作为参数:

gone.Context 是对 gin.Context的封装,兼容gin.Context

	ctr.root.GET("inject", func(logger gone.Logger, ctx *gone.Context) string {logger.Infof("inject")logger.Infof("hots: %s", ctx.Request.Host)return "inject"})
  1. 支持参数为一个匿名结构体,在结构体上做依赖注入标记:
	ctr.root.GET("inject", func(logger gone.Logger, ctx gone.Context, in struct {selects []int       `gone:"http,query=select"` //HTTP参数注入:表示取query参数中的select作为数组,要求值可以转为int类型logger2 gone.Logger `gone:"*"`                 //注入gone.Logger类型的logger}) string {logger.Infof("inject")logger.Infof("hots: %s", ctx.Request.Host)logger.Infof("selects: %v", in.selects)return "inject"})

更多关于 HTTP请求参数注入 只是,请参考:HTTP 注入说明

配置项

goner/gin支持通过配置,改变默认行为;关于配置的读取和配置文件的格式参考 配置读取

例子,将端口改为 8000

创建配置文件:

mkdir config
echo 'server.port=8000' > config/default.properties

更多配置项

配置项说明类型默认值
server.port监听端口int8080
server.host监听地址string0.0.0.0
server.modegin mode,可选值为:debug、test、releasestringrelease
server.html-tpl-pattern用于gin.LoadHTMLGlob加载模版路径string<空>
server.health-check配置一个路径用于监控检查string<空>
server.log.show-access-log是否打印访问日志booltrue
server.log.show-request-time是否在日志中打印请求耗时booltrue
server.log.data-max-length日志数据最大长度,超过该长度会截断,0为不限制int0
server.proxy.stat代理耗时统计boolfalse
server.return.wrapped-data使用{"code": ${code}, "msg": ${msg}, "data": ${data} }封装数据booltrue

更多例子

跳转 快速开始

这篇关于Gone框架介绍30 - 使用`goner/gin`提供Web服务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1086535

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画