Iris
以简单而强大的api
而闻名。 除了提供的低级访问权限, Iris
同样擅长MVC
。 它是唯一一个拥有MVC
架构模式丰富支持的Go Web
框架,性能成本接近于零。iris安装要求go版本至少为1.8,建议1.9
$ go get -u github.com/kataras/iris
安装完Iris,我们就可以跟着下面的简单示例运行我们的第一个web应用程序了:
//server.go
package main
import (
"github.com/kataras/iris"
)
func main() {
app := iris.New()
//输出html
// 请求方式: GET
// 访问地址: http://localhost:8080/welcome
app.Handle("GET", "/welcome", func(ctx iris.Context) {
// ctx.HTML返回一个html页面,
ctx.HTML("Welcome
")
})
//输出字符串
// 类似于 app.Handle("GET", "/ping", [...])
// 请求方式: GET
// 请求地址: http://localhost:8080/ping
app.Get("/ping", func(ctx iris.Context) {
// ctx.WriteString将向请求方返回一个字符串
ctx.WriteString("pong")
})
//输出json
// 请求方式: GET
// 请求地址: http://localhost:8080/hello
app.Get("/hello", func(ctx iris.Context) {
// ctx表示返回的结果,ctx.JSON即为返回一个json字符串
ctx.JSON(iris.Map{"message": "Hello Iris!"})
})
app.Run(iris.Addr(":8080"))//8080 监听端口
}
在前面的使用过程中,由于没有提供相关的配置,web程序启动之后将使用默认配置;但是,我们也可以根据自己的需要自定义配置,下面是一个配置的简单过程:
//config.go
package main
import (
"github.com/kataras/iris"
)
func main() {
app := iris.New()
app.Get("/", func(ctx iris.Context) {
ctx.HTML("Hello!")
})
// [...]
//我们可以用这种方法单独定义我们的配置项
app.Configure(iris.WithConfiguration(iris.Configuration{ DisableStartupLog:false}))
//也可以使用app.run的第二个参数
app.Run(iris.Addr(":8080"), iris.WithConfiguration(iris.Configuration{
DisableInterruptHandler: false,
DisablePathCorrection: false,
EnablePathEscape: false,
FireMethodNotAllowed: false,
DisableBodyConsumptionOnUnmarshal: false,
DisableAutoFireStatusCode: false,
TimeFormat: "Mon, 02 Jan 2006 15:04:05 GMT",
Charset: "UTF-8",
}))
//通过多参数配置 但是上面两种方式是我们最推荐的
// 我们使用With+配置项名称 如WithCharset("UTF-8") 其中就是With+ Charset的组合
//app.Run(iris.Addr(":8080"), iris.WithoutStartupLog, iris.WithCharset("UTF-8"))
//当使用app.Configure(iris.WithoutStartupLog, iris.WithCharset("UTF-8"))设置配置项时
//需要app.run()面前使用
}
为了使最终开发人员更容易,iris为所有HTTP方法提供了功能。第一个参数是路由的请求路径, 第二个可变参数应该包含一个或多个iris.Handler,当用户从服务器请求该特定的资源路径时,由注册顺序执行。
// 下面的方法将对GET请求进行监听,handler是一个iris.Handler的函数,可以包含一个或者多个,handler函数可以自定义
app.Get("/", handler)
分组路由 由路径前缀分组的一组路由可以(可选)共享相同的中间件处理程序和模板布局。一个组也可以有一个嵌套组。
Party 正在用于分组路由,开发人员可以声明无限数量的(嵌套)组。
下面是一个简单的例子,在Party部分将对/users
使用分组路由,可以看到,和前面相比,使用的是users.GET
不是app.GET
app := iris.New()
//请在参数化路径部分
users := app.Party("/users", myAuthMiddlewareHandler)
// http://localhost:8080/users/42/profile
users.Get("/{id:int}/profile", userProfileHandler)
// http://localhost:8080/users/inbox/1
users.Get("/inbox/{id:int}", userMessageHandler)
handler 在iris中称为中间件,iris为所有HTTP方法提供了功能。第一个参数是路由的请求路径, 第二个可变参数应该包含一个或多个iris.Handler,Handler是在HTTP请求生命周期中在主处理程序代码之前和/或之后运行代码。例如,记录中间件可能会将传入的请求详细信息写入日志,然后在写入有关日志响应的详细信息之前调用处理程序代码。我们可以通过自定义handler来实现想要的功能。
下面是一个使用handler的简单示例:
在代码中使用了三个中间件,根据参数的顺序会依次执行:before, mainHandler, after
// handler.go
package main
import "github.com/kataras/iris"
func main() {
app := iris.New()
app.Get("/", before, mainHandler, after)
app.Run(iris.Addr(":8080"))
}
func before(ctx iris.Context) {
shareInformation := "this is a sharable information between handlers"
requestPath := ctx.Path()
println("Before the mainHandler: " + requestPath)
ctx.Values().Set("info", shareInformation)
ctx.Next() //继续执行下一个handler,在本例中是mainHandler。
}
func after(ctx iris.Context) {
println("After the mainHandler")
}
func mainHandler(ctx iris.Context) {
println("Inside mainHandler")
// take the info from the "before" handler.
info := ctx.Values().GetString("info")
// write something to the client as a response.
ctx.HTML("Response
")
ctx.HTML("
Info: " + info)
ctx.Next() // 继续下一个handler 这里是after
}
使用下面的命令运行程序,:
$ go run handler.go
会得到下面的输出:
Now listening on: http://localhost:8080
Application started. Press CTRL+C to shut down.
Before the mainHandler: /
Inside mainHandler
After the mainHandler
开发web应用程序一个经常遇到的情况就是请求错误处理,虽然go在请求错误的情况(如404未找到)会像正常情况一样返回结果,但是我们也可以自定义在发生特定的http错误代码时定义自己的处理程序。
错误代码是大于或等于400的http状态代码,如404未找到和500内部服务器。
下面是一个使用错误处理的简单示例:
package main
import "github.com/kataras/iris"
func main(){
app := iris.New()
app.OnErrorCode(iris.StatusNotFound, notFound)
app.OnErrorCode(iris.StatusInternalServerError, internalServerError)
// 注册一个处理函数处理HTTP错误codes >=400:
// app.OnAnyErrorCode(handler)
app.Get("/", index)
app.Run(iris.Addr(":8080"))
}
func notFound(ctx iris.Context) {
// 当http.status=400 时向客户端渲染模板$views_dir/errors/404.html
ctx.View("errors/404.html")
}
//当出现错误的时候,再试一次
func internalServerError(ctx iris.Context) {
ctx.WriteString("Oups something went wrong, try again")
}
func index(ctx context.Context) {
ctx.View("index.html")
}