Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

High performance, simple Go web framework

License

NotificationsYou must be signed in to change notification settings

vicanso/elton

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

licenseBuild Status

Alt

Elton的实现参考了koa以及echo,中间件的调用为洋葱模型:请求由外至内,响应由内至外。主要特性如下:

  • 处理函数(中间件)均以返回error的形式响应出错,方便使用统一的出错处理中间件将出错统一转换为对应的输出(JSON),并根据出错的类型等生成各类统计分析
  • 成功响应数据直接赋值至Context.Body(interface{}),由统一的响应中间件将其转换为对应的输出(JSON,XML)
  • 支持不同种类的事件,如OnBeforeOnDoneOnError等,方便添加各类统计行为

如何使用elton开发WEB后端程序,可以参考一步一步学习如何使用elton

Hello, World!

下面我们来演示如何使用elton返回Hello, World!,并且添加了一些常用的中间件。

package mainimport ("github.com/vicanso/elton""github.com/vicanso/elton/middleware")funcmain() {e:=elton.New()// panic处理e.Use(middleware.NewRecover())// 出错处理e.Use(middleware.NewDefaultError())// 默认的请求数据解析e.Use(middleware.NewDefaultBodyParser())// not modified 304的处理e.Use(middleware.NewDefaultFresh())e.Use(middleware.NewDefaultETag())// 响应数据转换为jsone.Use(middleware.NewDefaultResponder())e.GET("/",func(c*elton.Context)error {c.Body=&struct {Messagestring`json:"message,omitempty"`}{"Hello, World!",}returnnil})e.GET("/books/{id}",func(c*elton.Context)error {c.Body=&struct {IDstring`json:"id,omitempty"`}{c.Param("id"),}returnnil})e.POST("/login",func(c*elton.Context)error {c.SetContentTypeByExt(".json")c.Body=c.RequestBodyreturnnil})err:=e.ListenAndServe(":3000")iferr!=nil {panic(err)}}
go run main.go

之后在浏览器中打开http://localhost:3000/则能看到返回的Hello, World!

路由

elton每个路由可以添加多个中间件处理函数,根据路由与及HTTP请求方法指定不同的路由处理函数。而全局的中间件则可通过Use方法来添加。

e.Use(...func(*elton.Context)error)e.Method(pathstring,...func(*elton.Context)error)
  • eelton实例化对象
  • Method 为HTTP的请求方法,如:GET,PUT,POST等等
  • path 为HTTP路由路径
  • func(*elton.Context) error 为路由处理函数(中间件),当匹配的路由被请求时,对应的处理函数则会被调用

路由示例

elton的路由使用chi的路由简化而来,下面是两个简单的示例。

// 带参数路由e.GET("/users/{type}",func(c*elton.Context)error {c.BodyBuffer=bytes.NewBufferString(c.Param("type"))returnnil})// 复合参数e.GET("/books/{category:[a-z-]+}-{type}",func(c*elton.Context)error {c.BodyBuffer=bytes.NewBufferString(c.Param("category")+c.Param("type"))returnnil})// 带中间件的路由配置e.GET("/users/me",func(c*elton.Context)error {c.Set("account","tree.xie")returnc.Next()},func(c*elton.Context)error {c.BodyBuffer=bytes.NewBufferString(c.GetString("account"))returnnil})

中间件

简单方便的中间件机制,依赖各类定制的中间件,通过各类中间件的组合,方便快捷实现各类HTTP服务,简单介绍数据响应与出错处理的中间件。需要注意,elton中默认不会执行所有的中间件,每个中间件决定是否需要执行后续处理,如果需要则调用Next()函数,与gin不一样(gin默认为执行所有,若不希望执行后续的中间件,则调用Abort)。

responder

HTTP请求响应数据时,需要将数据转换为Buffer返回,而在应用时响应数据一般为各类的struct或map等结构化数据,因此elton提供了Body(interface{})字段来保存这些数据,再使用自定义的中间件将数据转换为对应的字节数据,elton-responder提供了将struct(map)转换为json字节并设置对应的Content-Type,对于string([]byte)则直接输出。

package mainimport ("github.com/vicanso/elton""github.com/vicanso/elton/middleware")funcmain() {e:=elton.New()// 对响应数据 c.Body 转换为相应的json响应e.Use(middleware.NewDefaultResponder())getSession:=func(c*elton.Context)error {c.Set("account","tree.xie")returnc.Next()}e.GET("/users/me",getSession,func(c*elton.Context) (errerror) {c.Body=&struct {Namestring`json:"name"`Typestring`json:"type"`}{c.GetString("account"),"vip",}return})err:=e.ListenAndServe(":3000")iferr!=nil {panic(err)}}

error

当请求处理失败时,直接返回error则可,elton从error中获取出错信息并输出。默认的出错处理并不适合实际应用场景,建议使用自定义出错类配合中间件,便于统一的错误处理,程序监控,下面是引入错误中间件将出错转换为json形式的响应。

package mainimport ("github.com/vicanso/elton""github.com/vicanso/elton/middleware""github.com/vicanso/hes")funcmain() {e:=elton.New()// 指定出错以json的形式返回e.Use(middleware.NewError(middleware.ErrorConfig{ResponseType:"json",}))e.GET("/",func(c*elton.Context) (errerror) {err=&hes.Error{StatusCode:400,Category:"users",Message:"出错啦",}return})err:=e.ListenAndServe(":3000")iferr!=nil {panic(err)}}

更多的中间件可以参考middlewares

bench

goos: darwingoarch: amd64pkg: github.com/vicanso/eltonBenchmarkRoutes-8                        6925746               169.4 ns/op           120 B/op          2 allocs/opBenchmarkGetFunctionName-8              136577900                9.265 ns/op           0 B/op          0 allocs/opBenchmarkContextGet-8                   15311328                78.11 ns/op           16 B/op          1 allocs/opBenchmarkContextNewMap-8                187684261                6.276 ns/op           0 B/op          0 allocs/opBenchmarkConvertServerTiming-8           1484379               835.8 ns/op           360 B/op         11 allocs/opBenchmarkGetStatus-8                    1000000000               0.2817 ns/op          0 B/op          0 allocs/opBenchmarkFresh-8                          955664              1233 ns/op             416 B/op         10 allocs/opBenchmarkStatic-8                          25128             46709 ns/op           20794 B/op        471 allocs/opBenchmarkGitHubAPI-8                       14724             76190 ns/op           27175 B/op        609 allocs/opBenchmarkGplusAPI-8                       326769              3659 ns/op            1717 B/op         39 allocs/opBenchmarkParseAPI-8                       162340              6989 ns/op            3435 B/op         78 allocs/opBenchmarkRWMutexSignedKeys-8            71757390                17.51 ns/op            0 B/op          0 allocs/opBenchmarkAtomicSignedKeys-8             923771157                1.297 ns/op           0 B/op          0 allocs/opPASSok      github.com/vicanso/elton        20.225sgoos: darwingoarch: amd64pkg: github.com/vicanso/elton/middlewareBenchmarkGenETag-8                        230718              4409 ns/op             160 B/op          6 allocs/opBenchmarkMd5-8                            200134              5958 ns/op             120 B/op          6 allocs/opBenchmarkNewShortHTTPHeader-8           10220961               116.4 ns/op            80 B/op          2 allocs/opBenchmarkNewHTTPHeader-8                 4368654               277.1 ns/op            88 B/op          3 allocs/opBenchmarkNewHTTPHeaders-8                 384062              2822 ns/op            1182 B/op         23 allocs/opBenchmarkHTTPHeaderMarshal-8              225123              4664 ns/op            1344 B/op         21 allocs/opBenchmarkToHTTPHeader-8                   296210              3834 ns/op            1272 B/op         34 allocs/opBenchmarkHTTPHeaderUnmarshal-8            120136             10108 ns/op            1888 B/op         50 allocs/opBenchmarkProxy-8                           13393             85170 ns/op           16031 B/op        104 allocs/opPASSok      github.com/vicanso/elton/middleware     14.007s

[8]ページ先頭

©2009-2025 Movatter.jp