我們從iris web框架開始,開始呢,我們先不去計較和比較誰的速度快,誰的性能好,讓我們先學習如何使用,積累到了一定程度后,再去進行測試各個框架的速度性能。
ris自稱是Go語言中所有Web框架最快的,它的特點如下:
1.聚焦高性能
2.健壯的靜態路由支持和通配符子域名支持。
3.視圖系統支持超過5以上模板
4.支持定制事件的高可擴展性Websocket API
5.帶有GC, 內存 & redis 提供支持的會話
6.方便的中間件和插件
7.完整 REST API
8.能定制 HTTP 錯誤
9.Typescript編譯器 + 基於瀏覽器的編輯器
10.內容 negotiation & streaming
11.傳送層安全性
12.源碼改變后自動加載
13.OAuth, OAuth2 支持27+ API providers
14.JSON Web Tokens
kataras/iris簡介
github地址
https://github.com/kataras/iris
Star: 7938
文檔地址
https://docs.iris-go.com/
描述
關於kataras/iris的描述十分霸氣:
The fastest web framework for Go in (THIS) Earth. HTTP/2 Ready to GO. MVC when you need it.
還是那句話,暫時不去計較,只是學習。
獲取
go get -u github.com/kataras/iris
快速開始
新建main.go
新建views文件夾,在views中新建hello.html
main.go
package main
import "github.com/kataras/iris" func main() { app := iris.New() app.RegisterView(iris.HTML("./views", ".html")) app.Get("/", func(ctx iris.Context) { ctx.ViewData("message", "Hello world!") ctx.View("hello.html") }) app.Run(iris.Addr(":8080")) }
hello.html
<html> <head> <title>Hello Page</title> </head> <body> <h1>{{.message}}</h1> </body> </html>
運行,在瀏覽器輸入http://localhost:8080/,得到運行結果。
basic認證
之前寫過關於basic認證的文章:
Go實戰–通過basic認證的http(basic authentication)
package main import ( "time" "github.com/kataras/iris" "github.com/kataras/iris/context" "github.com/kataras/iris/middleware/basicauth" ) func newApp() *iris.Application { app := iris.New() authConfig := basicauth.Config{ Users: map[string]string{"wangshubo": "wangshubo", "superWang": "superWang"}, Realm: "Authorization Required", Expires: time.Duration(30) * time.Minute, } authentication := basicauth.New(authConfig) app.Get("/", func(ctx context.Context) { ctx.Redirect("/admin") }) needAuth := app.Party("/admin", authentication) { //http://localhost:8080/admin needAuth.Get("/", h) // http://localhost:8080/admin/profile needAuth.Get("/profile", h) // http://localhost:8080/admin/settings needAuth.Get("/settings", h) } return app } func main() { app := newApp() app.Run(iris.Addr(":8080")) } func h(ctx context.Context) { username, password, _ := ctx.Request().BasicAuth() ctx.Writef("%s %s:%s", ctx.Path(), username, password) }
Markdown
Go實戰–golang中使用markdown(russross/blackfriday)
package main import ( "time" "github.com/kataras/iris" "github.com/kataras/iris/context" "github.com/kataras/iris/cache" ) var markdownContents = []byte(`## Hello Markdown This is a sample of Markdown contents Features -------- All features of Sundown are supported, including: * **Compatibility**. The Markdown v1.0.3 test suite passes with the --tidy option. Without --tidy, the differences are mostly in whitespace and entity escaping, where blackfriday is more consistent and cleaner. * **Common extensions**, including table support, fenced code blocks, autolinks, strikethroughs, non-strict emphasis, etc. * **Safety**. Blackfriday is paranoid when parsing, making it safe to feed untrusted user input without fear of bad things happening. The test suite stress tests this and there are no known inputs that make it crash. If you find one, please let me know and send me the input that does it. NOTE: "safety" in this context means *runtime safety only*. In order to protect yourself against JavaScript injection in untrusted content, see [this example](https://github.com/russross/blackfriday#sanitize-untrusted-content). * **Fast processing**. It is fast enough to render on-demand in most web applications without having to cache the output. * **Routine safety**. You can run multiple parsers in different goroutines without ill effect. There is no dependence on global shared state. * **Minimal dependencies**. Blackfriday only depends on standard library packages in Go. The source code is pretty self-contained, so it is easy to add to any project, including Google App Engine projects. * **Standards compliant**. Output successfully validates using the W3C validation tool for HTML 4.01 and XHTML 1.0 Transitional. [this is a link](https://github.com/kataras/iris) `) func main() { app := iris.New() app.Get("/", cache.Handler(10*time.Second), writeMarkdown) app.Run(iris.Addr(":8080")) } func writeMarkdown(ctx context.Context) { println("Handler executed. Content refreshed.") ctx.Markdown(markdownContents) }
YAML
Go實戰–go語言中使用YAML配置文件(與json、xml、ini對比)
iris.yml
DisablePathCorrection: false EnablePathEscape: false FireMethodNotAllowed: true DisableBodyConsumptionOnUnmarshal: true TimeFormat: Mon, 01 Jan 2006 15:04:05 GMT Charset: UTF-8
main.go
package main import ( "github.com/kataras/iris" "github.com/kataras/iris/context" ) func main() { app := iris.New() app.Get("/", func(ctx context.Context) { ctx.HTML("<b>Hello!</b>") }) app.Run(iris.Addr(":8080"), iris.WithConfiguration(iris.YAML("./iris.yml"))) }
Post Json
Go實戰–net/http中JSON的使用(The way to go)
package main import ( "fmt" "github.com/kataras/iris" "github.com/kataras/iris/context" ) type Company struct { Name string City string Other string } func MyHandler(ctx context.Context) { c := &Company{} if err := ctx.ReadJSON(c); err != nil { panic(err.Error()) } else { fmt.Printf("Company: %#v", c) ctx.Writef("Company: %#v", c) } } func main() { app := iris.New() app.Post("/bind_json", MyHandler) app.Run(iris.Addr(":8080")) }
curl命令行執行:
curl -d '{"Name":"vSuperWang", "City":"beijing", "Other":"shit"}' -H "Content-Type: application/json" -X POST http://localhost:8080/bind_json