可能根據(jù)項(xiàng)目不同可以選下面不同框架宇驾,里面具體的沒有對(duì)對(duì)比,如果想深入了解或?qū)W習(xí)可以在之后再深入猴伶,這里提供簡單的引入课舍,廢話不多少,上代碼:
1他挎、Martini
Martini框架是使用Go語言作為開發(fā)語言的一個(gè)強(qiáng)力的快速構(gòu)建模塊化web應(yīng)用與服務(wù)的開發(fā)框架筝尾。Martini是一個(gè)專門用來處理Web相關(guān)內(nèi)容的框架,其并沒有自帶有關(guān)ORM或詳細(xì)的分層內(nèi)容办桨。所以當(dāng)我們使用Martini作為我們的開發(fā)框架時(shí)筹淫,我們還需要選取適合的ORM等其他包。
package main
import (
"github.com/astaxie/beego/context"
"github.com/go-martini/martini"
"github.com/martini-contrib/render"
"net/http"
"fmt"
)
//定義一個(gè)自己的中間件呢撞,這里將beego的context注入
func myContext() martini.Handler {
return func(res http.ResponseWriter, req *http.Request, c martini.Context) {
ctx := context.Context{Request: req, ResponseWriter: res}
ctx.Input = context.NewInput(req)
ctx.Output = context.NewOutput()
c.Map(ctx)
}
}
func main() {
m := martini.Classic()
m.Use(render.Renderer()) //注入中間件(渲染JSON和HTML模板的處理器中間件)
m.Use(myContext()) //注入自己寫的中間件
m.Use(func(c martini.Context) {
fmt.Println("before a request")
c.Next() //Next方法之后最后處理
fmt.Println("after a request")
})
//普通的GET方式路由
m.Get("/", func() string {
return "hello world!"
})
//路由分組
m.Group("/books", func(r martini.Router) {
r.Get("/list", getBooks)
r.Post("/add", getBooks)
r.Delete("/delete", getBooks)
})
//我們以中間件的方式來注入一個(gè)Handler
m.Use(MyHeader(m))
m.RunOnAddr(":8080") //運(yùn)行程序監(jiān)聽端口
}
func getBooks() string {
return "books"
}
//中間件Handler
func MyHeader(m *martini.ClassicMartini) martini.Handler {
return func() {
m.Group("/app", func(r martini.Router) {
my := new(App)
r.Get("/index", my.Index)
r.Get("/test/:aa", my.Test)
})
}
}
//應(yīng)用的處理
type App struct{}
func (this *App) Index(r render.Render, ctx context.Context) {
fmt.Println(ctx.Input.Query("action"))
ctx.WriteString("你好世界")
}
func (this *App) Test(r render.Render, params martini.Params, req *http.Request) {
fmt.Println(params)
parm := make(map[string]interface{})
if t, ok := params["aa"]; ok {
parm["aa"] = t
}
req.ParseForm()
fmt.Println(parm, req.Form)
r.Text(200, "----")
}
參考:(1)https://github.com/go-martini/martini/blob/master/translations/README_zh_cn.md
(2)https://studygolang.com/articles/5196
2损姜、dotweb
github地址:https://github.com/devfeel/dotweb
(1)安裝
> $ go get -u github.com/devfeel/dotweb
(2) 簡單實(shí)踐:
package main
import (
"fmt"
"github.com/devfeel/dotweb"
)
const port = 8080
// Res struct
type Res struct {
Result string `json:"result"`
Data string `json:"data"`
Name string `json:"name"`
}
//測(cè)試dotweb這個(gè)框架
func main() {
app := dotweb.New() //初始化dotweb server
app.SetLogPath("/user/local/")
//設(shè)置路由
InitRouter(app.HttpServer)
err := app.StartServer(port)
if err != nil {
fmt.Println("dotweb startServer is err, err message is:", err)
return
}
fmt.Println("成功接收")
}
//InitRouter func
func InitRouter(server *dotweb.HttpServer) {
server.Router().GET("/push", Index)
}
//Index func
func Index(server *dotweb.HttpContext) {
name := server.FormValue("name")
if name == "" {
fmt.Println("獲取name字段為nil")
return
}
server.WriteJson(&Res{
Result: "success",
Data: "成功",
})
}
其他例子可以參考:https://github.com/devfeel/dotweb-example
(3)Feature
- 支持靜態(tài)路由、參數(shù)路由殊霞、組路由
- 路由支持文件/目錄服務(wù)摧阅,支持設(shè)置是否允許目錄瀏覽
- HttpModule支持,支持路由之前全局級(jí)別的自定義代碼能力
- 中間件支持绷蹲,支持App棒卷、Group、Router級(jí)別的設(shè)置 - https://github.com/devfeel/middleware
- Feature支持祝钢,可綁定HttpServer全局啟用
- 支持STRING/JSON/JSONP/HTML格式輸出
- 集成Mock能力
- 集成Timeout Hook
- 全局HTTP錯(cuò)誤處理
- 全局日志處理
- 支持Hijack與websocket
- 內(nèi)建Cache支持
- 內(nèi)建Session支持 - 支持主備redis自動(dòng)切換
- 內(nèi)建TLS支持
- 支持接入第三方模板引擎(需實(shí)現(xiàn)dotweb.Renderer接口)
- 模塊可配置
- 自集成基礎(chǔ)統(tǒng)計(jì)數(shù)據(jù)比规,并支持按分鐘為單位的間隔時(shí)間統(tǒng)計(jì)數(shù)據(jù)輸出
(4)配置例子 - dotweb.conf
<?xml version="1.0" encoding="UTF-8"?>
<config>
<app logpath="d:/gotmp/" enabledlog="true" runmode="development"/>
<server isrun="true" indexpage="index.html" port="8080" enabledgzip="false" enabledlistdir="false" enabledautohead="true" requesttimeout="30000"/>
<session enabled="true" mode="runtime" timeout="20" />
<appset>
<set key="set1" value="1" />
<set key="set2" value="2" />
<set key="set3" value="3" />
<set key="set4" value="4" />
</appset>
<middlewares>
<middleware name="applog" isuse="true" />
</middlewares>
<routers>
<router method="GET" path="/index" handler="Index" isuse="true">
<middleware name="urllog" isuse="true" />
</router>
<router method="GET" path="/index2" handler="Index" isuse="true">
<middleware name="urllog" isuse="true" />
</router>
<router method="GET" path="/index3" handler="Index" isuse="true">
<middleware name="urllog" isuse="true" />
</router>
<router method="GET" path="/redirect" handler="Redirect" isuse="true"></router>
<router method="GET" path="/error" handler="Error" isuse="true"></router>
<router method="GET" path="/panic" handler="Panic" isuse="true"></router>
<router method="GET" path="/appset" handler="appset" isuse="true"></router>
</routers>
<groups>
<group path="/admin" isuse="true">
<middleware name="grouplog" isuse="true" />
<middleware name="simpleauth" isuse="true" />
<router method="GET" path="/login" handler="Login" isuse="true">
<middleware name="urllog" isuse="true" />
</router>
<router method="GET" path="/login3" handler="Login" isuse="true"></router>
<router method="GET" path="/logout" handler="Logout" isuse="true"></router>
<router method="GET" path="/login2" handler="Login" isuse="true"></router>
</group>
</groups>
</config>
{
"App": {
"LogPath": "d:/gotmp/",
"EnabledLog": true,
"RunMode": "development",
"PProfPort": 0,
"EnabledPProf": false
},
"AppSets": [{
"Key": "set1",
"Value": "1"
}, {
"Key": "set2",
"Value": "2"
}, {
"Key": "set3",
"Value": "3"
}, {
"Key": "set4",
"Value": "4"
}],
"Offline": {
"Offline": false,
"OfflineText": "",
"OfflineUrl": ""
},
"Server": {
"EnabledListDir": false,
"EnabledRequestID": false,
"EnabledGzip": false,
"EnabledAutoHEAD": true,
"EnabledAutoCORS": false,
"EnabledIgnoreFavicon": false,
"EnabledBindUseJsonTag": false,
"Port": 8080,
"EnabledTLS": false,
"TLSCertFile": "",
"TLSKeyFile": "",
"IndexPage": "index.html",
"EnabledDetailRequestData": false
},
"Session": {
"EnabledSession": true,
"SessionMode": "runtime",
"Timeout": 20,
"ServerIP": "",
"UserName": "",
"Password": ""
},
"Routers": [{
"Method": "GET",
"Path": "/index",
"HandlerName": "Index",
"Middlewares": [{
"Name": "urllog",
"IsUse": true
}],
"IsUse": true
}, {
"Method": "GET",
"Path": "/index2",
"HandlerName": "Index",
"Middlewares": [{
"Name": "urllog",
"IsUse": true
}],
"IsUse": true
}, {
"Method": "GET",
"Path": "/index3",
"HandlerName": "Index",
"Middlewares": [{
"Name": "urllog",
"IsUse": true
}],
"IsUse": true
}, {
"Method": "GET",
"Path": "/redirect",
"HandlerName": "Redirect",
"Middlewares": null,
"IsUse": true
}, {
"Method": "GET",
"Path": "/error",
"HandlerName": "Error",
"Middlewares": null,
"IsUse": true
}, {
"Method": "GET",
"Path": "/panic",
"HandlerName": "Panic",
"Middlewares": null,
"IsUse": true
}, {
"Method": "GET",
"Path": "/appset",
"HandlerName": "appset",
"Middlewares": null,
"IsUse": true
}],
"Groups": [{
"Path": "/admin",
"Routers": [{
"Method": "GET",
"Path": "/login",
"HandlerName": "Login",
"Middlewares": [{
"Name": "urllog",
"IsUse": true
}],
"IsUse": true
}, {
"Method": "GET",
"Path": "/login3",
"HandlerName": "Login",
"Middlewares": null,
"IsUse": true
}, {
"Method": "GET",
"Path": "/logout",
"HandlerName": "Logout",
"Middlewares": null,
"IsUse": true
}, {
"Method": "GET",
"Path": "/login2",
"HandlerName": "Login",
"Middlewares": null,
"IsUse": true
}],
"Middlewares": [{
"Name": "grouplog",
"IsUse": true
}, {
"Name": "simpleauth",
"IsUse": true
}],
"IsUse": true
}],
"Middlewares": [{
"Name": "applog",
"IsUse": true
}]
}
(5) 路由
- 支持GET\POST\HEAD\OPTIONS\PUT\PATCH\DELETE 這幾類請(qǐng)求方法
- 支持HiJack\WebSocket\ServerFile三類特殊應(yīng)用
- 支持Any注冊(cè)方式,默認(rèn)兼容GET\POST\HEAD\OPTIONS\PUT\PATCH\DELETE方式
- 支持通過配置開啟默認(rèn)添加HEAD方式
- 支持注冊(cè)Handler拦英,以啟用配置化
- 支持檢查請(qǐng)求與指定路由是否匹配
(6)其他可以借鑒這里:https://www.ctolib.com/dotweb.html
3苞俘、gin框架
Gin是一個(gè)golang的微框架,封裝比較優(yōu)雅龄章,API友好吃谣,源碼注釋比較明確,已經(jīng)發(fā)布了1.0版本做裙。具有快速靈活岗憋,容錯(cuò)方便等特點(diǎn)。其實(shí)對(duì)于golang而言锚贱,web框架的依賴要遠(yuǎn)比Python仔戈,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯(cuò)监徘〗蓿框架更像是一些常用函數(shù)或者工具的集合。借助框架開發(fā)凰盔,不僅可以省去很多常用的封裝帶來的時(shí)間墓卦,也有助于團(tuán)隊(duì)的編碼風(fēng)格和形成規(guī)范。
下面就Gin的用法做一個(gè)簡單的介紹户敬。
首先需要安裝落剪,安裝比較簡單,使用go get即可:
$ go get gopkg.in/gin-gonic/gin.v1
gin的版本托管再 gopkg的網(wǎng)站上尿庐。我在安裝的過程中忠怖,gokpg卡住了,后來不得不根據(jù)gin里的godep的文件抄瑟,把響應(yīng)的源碼從github上下載凡泣,然后copy到對(duì)應(yīng)的目錄。
package main
import (
"gopkg.in/gin-gonic/gin.v1"
"net/http"
)
func main(){
router := gin.Default()
router.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello World")
})
router.Run(":8000")
}
簡單幾行代碼皮假,就能實(shí)現(xiàn)一個(gè)web服務(wù)鞋拟。使用gin的Default方法創(chuàng)建一個(gè)路由handler。然后通過HTTP方法綁定路由規(guī)則和路由函數(shù)钞翔。不同于net/http庫的路由函數(shù)严卖,gin進(jìn)行了封裝,把request和response都封裝到gin.Context的上下文環(huán)境布轿。最后是啟動(dòng)路由的Run方法監(jiān)聽端口哮笆。麻雀雖小,五臟俱全汰扭。當(dāng)然稠肘,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等常用的restful方法萝毛。
restful路由,gin的路由來自httprouter庫项阴。因此httprouter具有的功能,gin也具有笆包,不過gin不支持路由正則表達(dá)式:
func main(){
router := gin.Default()
router.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s", name)
})
}
冒號(hào):加上一個(gè)參數(shù)名組成路由參數(shù)环揽。可以使用c.Params的方法讀取其值庵佣。當(dāng)然這個(gè)值是字串string歉胶。諸如/user/rsj217,和/user/hello都可以匹配巴粪,而/user/和/user/rsj217/不會(huì)被匹配通今。除了:粥谬,gin還提供了號(hào)處理參數(shù),號(hào)能匹配的規(guī)則就更多辫塌。
func main(){
router := gin.Default()
router.GET("/user/:name/*action", func(c *gin.Context) {
name := c.Param("name")
action := c.Param("action")
message := name + " is " + action
c.String(http.StatusOK, message)
})
}
參考:https://studygolang.com/articles/11819?fr=sidebar
4漏策、iris
(1) github地址https://github.com/kataras/iris
(2) 文檔https://docs.iris-go.com/
(3) 安裝
$ go get -u github.com/kataras/iris
(4)簡單的Hello world
package main
import "github.com/kataras/iris"
func main() {
app := iris.Default()
// Method: GET
// Resource: http://localhost:8080/
app.Handle("GET", "/", func(ctx iris.Context) {
ctx.HTML("Hello world!")
})
// same as app.Handle("GET", "/ping", [...])
// Method: GET
// Resource: http://localhost:8080/ping
app.Get("/ping", func(ctx iris.Context) {
ctx.WriteString("pong")
})
// Method: GET
// Resource: http://localhost:8080/hello
app.Get("/hello", func(ctx iris.Context) {
ctx.JSON(iris.Map{"message": "Hello iris web framework."})
})
// http://localhost:8080
// http://localhost:8080/ping
// http://localhost:8080/hello
app.Run(iris.Addr(":8080"))
}
(5)運(yùn)行
> $ go run main.go
新打開個(gè)窗口執(zhí)行
curl http://localhost:8080
結(jié)果 Hello world!
或在瀏覽器 訪問http://localhost:8080
原文:https://blog.csdn.net/guyan0319/article/details/80625913
5、echo
(1)安裝
$ go get github.com/labstack/echo/...
(2) 編寫Hello World
package main
import (
"net/http"
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
})
e.Logger.Fatal(e.Start(":1323"))
}
啟動(dòng)服務(wù)
$ go run server.go
用在瀏覽器訪問 http://localhost:1323 然后你就能在頁面上看到Hello, World!
(3) 路由
e.POST("/users", saveUser)
e.GET("/users/:id", getUser)
e.PUT("/users/:id", updateUser)
e.DELETE("/users/:id", deleteUser)
其他操作可以參考:http://go-echo.org
原文:http://go-echo.org