You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

7.1 KiB

Negroni(尼格龍尼) GoDoc wercker status

尼格龍尼符合Go的web 中介器特性. 精簡、非侵入式、鼓勵使用 net/http Handler.

如果你喜歡Martini,但覺得這其中包太多神奇的功能,那麼尼格龍尼會是你的最佳選擇。

入門

安裝完Go且設好GOPATH,建立你的第一個.go檔。可以命名為server.go

package main

import (
  "github.com/codegangsta/negroni"
  "net/http"
  "fmt"
)

func main() {
  mux := http.NewServeMux()
  mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
    fmt.Fprintf(w, "Welcome to the home page!")
  })

  n := negroni.Classic()
  n.UseHandler(mux)
  n.Run(":3000")
}

安裝尼格龍尼套件 (最低需求為go 1.1或更高版本):

go get github.com/codegangsta/negroni

執行伺服器:

go run server.go

你現在起了一個Go的net/http網頁伺服器在localhost:3000.

有問題?

如果你有問題或新功能建議,到這郵件群組討論。尼格龍尼在GitHub上的issues專欄是專門用來回報bug跟pull requests。

尼格龍尼是個framework嗎?

尼格龍尼不是framework是個設計用來直接使用net/http的library。

路由?

尼格龍尼是BYOR (Bring your own Router帶給你自訂路由)。在Go社群已經有大量可用的http路由器, 尼格龍尼試著做好完全支援net/http,例如與Gorilla Mux整合:

router := mux.NewRouter()
router.HandleFunc("/", HomeHandler)

n := negroni.New(中介器1, 中介器2)
// Or use a 中介器 with the Use() function
n.Use(中介器3)
// router goes last
n.UseHandler(router)

n.Run(":3000")

negroni.Classic()

negroni.Classic() 提供一些好用的預設中介器:

  • negroni.Recovery - Panic 還原中介器
  • negroni.Logging - Request/Response 紀錄中介器
  • negroni.Static - 在"public"目錄下的靜態檔案服務

尼格龍尼的這些功能讓你開發變得很簡單。

處理器(Handlers)

尼格龍尼提供一個雙向中介器的機制,介面為negroni.Handler:

type Handler interface {
  ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)
}

如果中介器沒有寫入ResponseWriter會呼叫通道裡面的下個http.HandlerFunc讓給中介處理器。可以被用來做良好的應用:

func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
  // 在這之前做一些事
  next(rw, r)
  // 在這之後做一些事
}

然後你可以透過Use函數對應到處理器的通道:

n := negroni.New()
n.Use(negroni.HandlerFunc(MyMiddleware))

你也可以應原始的舊http.Handler:

n := negroni.New()

mux := http.NewServeMux()
// map your routes

n.UseHandler(mux)

n.Run(":3000")

Run()

尼格龍尼有一個很好用的函數RunRun接收addr字串辨識http.ListenAndServe

n := negroni.Classic()
// ...
log.Fatal(http.ListenAndServe(":8080", n))

路由特有中介器

如果你有一群路由需要執行特別的中介器,你可以簡單的建立一個新的尼格龍尼實體當作路由處理器。

router := mux.NewRouter()
adminRoutes := mux.NewRouter()
// add admin routes here

// 為管理中介器建立一個新的尼格龍尼
router.Handle("/admin", negroni.New(
  Middleware1,
  Middleware2,
  negroni.Wrap(adminRoutes),
))

第三方中介器

以下為目前尼格龍尼兼容的中介器清單。如果你自己做了一個中介器請自由放入你的中介器互換連結:

中介器 作者 說明
RestGate Prasanga Siripala REST API入口的安全認證
Graceful Tyler Bunnell 優雅的HTTP關機
secure Cory Jacobsen 檢疫安全功能的中介器
JWT Middleware Auth0 檢查JWT的中介器用來解析傳入請求的Authorization header
binding Matt Holt 將HTTP請求轉到structs的資料綁定
logrus Dan Buch 基於Logrus的紀錄器
render Cory Jacobsen 渲染JSON、XML、HTML的樣板
gorelic Jingwen Owen Ou Go執行中的New Relic agent
gzip phyber GZIP回應壓縮
oauth2 David Bochenski oAuth2中介器
sessions David Bochenski Session管理
permissions2 Alexander Rødseth Cookies與使用者權限
onthefly Alexander Rødseth 快速產生TinySVG、HTM、CSS
cors Olivier Poitrey Cross Origin Resource Sharing 支援(CORS)
xrequestid Andrea Franz 在每個request指定一個隨機X-Request-Id header的中介器
VanGoH Taylor Wrobel Configurable AWS-Style HMAC 授權中介器
stats Florent Messa 儲存關於你的網頁應用資訊 (回應時間之類)

範例

mooseware是用來寫尼格龍尼中介處理器的骨架,由Alexander Rødseth建立。

即時程式重載?

ginfresh兩個尼格龍尼即時重載的應用。

Go & 尼格龍尼初學者必讀

關於

尼格龍尼正是Code Gangsta的執著設計。 譯者: Festum Qin (Festum@G.PL)