天天看點

Go實戰--也許最快的Go語言Web架構kataras/iris初識(basic認證、Markdown、YAML、Json)

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"))
}           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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)
}           
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

Markdown

Go實戰–golang中使用markdown(russross/blackfriday)
package main

import (
    "time"

           
<span class="hljs-string">"github.com/kataras/iris"</span>
<span class="hljs-string">"github.com/kataras/iris/context"</span>

<span class="hljs-string">"github.com/kataras/iris/cache"</span>
           

)

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 .
  • 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 `)

func main() {

app := iris.New()

app.Get(<span class="hljs-string">"/"</span>, cache.Handler<span class="hljs-number">(10</span>*time.Second), writeMarkdown)
app.Run(iris.Addr(<span class="hljs-string">":8080"</span>))
           

}

func writeMarkdown(ctx context.Context) {

println(“Handler executed. Content refreshed.”)

ctx.Markdown(markdownContents)

  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

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           
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