本文摘自php中文网,作者藏色散人,侵删。
golang iris使用安装iris 1
<span style=
"font-size: 14px;"
>go get github.com/kataras/iris<br></span>
实例 注册一个route到服务的API 1
<span style=
"font-size: 14px;"
>app := iris.New()<br><br>app.Handle(
"GET"
,
"/ping"
, func(ctx iris.Context) {<br> ctx.JSON(iris.Map{
"message"
:
"pong"
})<br>})<br><br>app.Run(iris.Addr(
":8080"
))<br></span>
几行代码就可以实现,通过浏览器访问http://localhost:8080/ping会返回{"message":"pong"}
使用Handle函数可以注册方法,路径和对应的处理函数
添加middleware 如果我们希望记录下所有的请求的log信息还希望在调用相应的route时确认请求的UA是否是我们允许的可以通过Use函数添加相应的middleware
1
<span style=
"font-size: 14px;"
>package main<br><br>import (<br>
"github.com/kataras/iris"
<br>
"github.com/kataras/iris/middleware/logger"
<br>)<br><br>func main() {<br> app := iris.New()<br><br> app.Use(logger.New())<br> app.Use(checkAgentMiddleware)<br><br> app.Handle(
"GET"
,
"/ping"
, func(ctx iris.Context) {<br> ctx.JSON(iris.Map{
"message"
:
"pong"
})<br> })<br><br> app.Run(iris.Addr(
":8080"
))<br>}<br><br>func checkAgentMiddleware(ctx iris.Context) {<br> ctx.Application().Logger().Infof(
"Runs before %s"
, ctx.Path())<br> user_agent := ctx.GetHeader(
"User-Agent"
)<br><br>
if
user_agent !=
"pingAuthorized"
{<br> ctx.JSON(
"No authorized for ping"
)<br>
return
<br> }<br> ctx.Next()<br>}<br></span>
使用postman访问在Header中添加User-Agent访问/ping可以正常返回结果,如果去掉User-Agent则会返回我们设定的"No authorized for ping"。因为我们添加了iris的log middleware所以在访问时会在终端显示相应的log信息
取得请求参数,展示到html bookinfo.html
1
<span style=
"font-size: 14px;"
><html><br> <head>Book information</head><br> <body><br> <h2>{{ .bookName }}</h2><br> <h1>{{ .bookID }}</h1><br> <h1>{{ .author }}</h1><br> <h1>{{ .chapterCount }}</h1><br> </body><br></html><br></span>
main.go
1
<span style=
"font-size: 14px;"
>package main<br><br>import
"github.com/kataras/iris"
<br><br>func main() {<br> app := iris.New()<br><br> app.RegisterView(iris.HTML(
"./views"
,
".html"
))<br><br> app.Handle(
"GET"
,
"/bookinfo/{bookid:string}"
, func(ctx iris.Context) {<br> bookID := ctx.Params().GetString(
"bookid"
)<br><br> ctx.ViewData(
"bookName"
,
"Master iris"
)<br> ctx.ViewData(
"bookID"
, bookID)<br> ctx.ViewData(
"author"
,
"Iris expert"
)<br> ctx.ViewData(
"chapterCount"
,
"40"
)<br><br> ctx.View(
"bookinfo.html"
)<br> })<br><br> app.Run(iris.Addr(
":8080"
))<br>}<br></span>
取得请求中带的参数
1
ctx.Params().GetString(
"bookid"
)
设置html中变量的值
route允许和禁止外部访问
实际使用中有时会有些route只能内部使用,对外访问不到。 可以通过使用 XXX_route.Method = iris.MethodNone设定为offline 内部调用通过使用函数 Context.Exec("NONE", "/XXX_yourroute")
main.go
1
<span style=
"font-size: 14px;"
>package main<br><br>import
"github.com/kataras/iris"
<br><br>import
"strings"
<br><br>func main() {<br> app := iris.New()<br><br> magicAPI := app.Handle(
"NONE"
,
"/magicapi"
, func(ctx iris.Context) {<br>
if
ctx.GetCurrentRoute().IsOnline() {<br> ctx.Writef(
"I'm back!"
)<br> }
else
{<br> ctx.Writef(
"I'll be back"
)<br> }<br> })<br><br> app.Handle(
"GET"
,
"/onoffhandler/{method:string}/{state:string}"
, func(ctx iris.Context) {<br> changeMethod := ctx.Params().GetString(
"method"
)<br> state := ctx.Params().GetString(
"state"
)<br><br>
if
changeMethod ==
""
|| state ==
""
{<br>
return
<br> }<br><br>
if
strings.Index(magicAPI.Path, changeMethod) == 1 {<br> settingState := strings.ToLower(state)<br>
if
settingState ==
"on"
|| settingState ==
"off"
{<br>
if
strings.ToLower(state) ==
"on"
&& !magicAPI.IsOnline() {<br> magicAPI.Method = iris.MethodGet<br> }
else
if
strings.ToLower(state) ==
"off"
&& magicAPI.IsOnline() {<br> magicAPI.Method = iris.MethodNone<br> }<br><br> app.RefreshRouter()<br><br> ctx.Writef(
"\n Changed magicapi to %s\n"
, state)<br> }
else
{<br> ctx.Writef(
"\n Setting state incorrect(\"on\" or \"off\") \n"
)<br> }<br><br> }<br> })<br><br> app.Handle(
"GET"
,
"/execmagicapi"
, func(ctx iris.Context) {<br> ctx.Values().Set(
"from"
,
"/execmagicapi"
)<br><br>
if
!magicAPI.IsOnline() {<br> ctx.
Exec
(
"NONE"
,
"/magicapi"
)<br> }
else
{<br> ctx.
Exec
(
"GET"
,
"/magicapi"
)<br> }<br> })<br><br> app.Run(iris.Addr(
":8080"
))<br>}<br></span>
测试:
1
2
3
4
<1>访问http:
<2>访问http:
<3>访问http:
<4>再次访问http:
grouping route
在实际应用中会根据实际功能进行route的分类,例如users,books,community等。
1
2
3
4
5
6
/users/getuserdetail
/users/getusercharges
/users/getuserhistory
/books/bookinfo
/books/chapterlist
对于这类route可以把他们划分在users的group和books的group。对该group会有共通的handler处理共同的一些处理
1
<span style=
"font-size: 14px;"
>package main<br><br>import (<br>
"time"
<br><br>
"github.com/kataras/iris"
<br>
"github.com/kataras/iris/middleware/basicauth"
<br>)<br><br>func bookInfoHandler(ctx iris.Context) {<br> ctx.HTML(
"<h1>Calling bookInfoHandler </h1>"
)<br> ctx.HTML(
"<br/>bookID:"
+ ctx.Params().Get(
"bookID"
))<br> ctx.Next()<br>}<br><br>func chapterListHandler(ctx iris.Context) {<br> ctx.HTML(
"<h1>Calling chapterListHandler </h1>"
)<br> ctx.HTML(
"<br/>bookID:"
+ ctx.Params().Get(
"bookID"
))<br> ctx.Next()<br>}<br><br>func main() {<br> app := iris.New()<br><br> authConfig := basicauth.Config{<br> Users: map[string]string{
"bookuser"
:
"testabc123"
},<br> Realm:
"Authorization required"
,<br> Expires: time.Duration(30) * time.Minute,<br> }<br><br> authentication := basicauth.New(authConfig)<br><br> books := app.Party(
"/books"
, authentication)<br><br> books.Get(
"/{bookID:string}/bookinfo"
, bookInfoHandler)<br> books.Get(
"/chapterlist/{bookID:string}"
, chapterListHandler)<br><br> app.Run(iris.Addr(
":8080"
))<br>}<br></span>
上例中使用了basicauth。对所有访问books group的routes都会先做auth认证。认证方式是username和password。
在postman中访问 http://localhost:8080/books/sfsg3234/bookinfo 设定Authorization为Basic Auth,Username和Password设定为程序中的值,访问会正确回复。否则会回复Unauthorized
更多golang相关技术文章,请访问golang 教程栏目!
以上就是解析golang iris怎么使用的详细内容,更多文章请关注木庄网络博客 !!
相关阅读 >>
go-锁机制
redis 实战 —— 01. redis 数据结构简介
[concurrent-map]-并发map在go中的使用
手撸golang go与微服务 聚合模式
解析go中的多态 -无需interfaces
golang slice如何拷贝
golang 开发时如何debug
go 项目开发过程中的管理规范
golang 进行文件夹的压缩与解压
聊聊storagetapper的lock
更多相关阅读请进入《golang 》频道 >>
¥0元 老貘
一个与时俱进的Go编程知识库。
转载请注明出处:木庄网络博客 » 解析golang iris怎么使用