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

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为