Go实战--Golang中http中间件(goji/httpauth、urfave/negroni、go
生命不止,继续go go go !!! 不知不觉,2018年第一个月份已经过完,看了看一月份uv统计: 杭州 2834 成都 2059 西安 982 言归正传! Middlewares(中间件)wiki上对中间件的解释: 通俗的讲: Middleware in Webservice Go语言中实现和使用middleware是非常简单
如果不了解golang总的http handler,可以参考:
一个带有多个中间件的例子 package main
import (
"log"
"net/http"
)
func middlewareOne(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter,r *http.Request) {
log.Println("Executing middlewareOne")
next.ServeHTTP(w,r)
log.Println("Executing middlewareOne again")
})
}
func middlewareTwo(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter,r *http.Request) {
log.Println("Executing middlewareTwo")
if r.URL.Path != "/" {
return
}
next.ServeHTTP(w,r)
log.Println("Executing middlewareTwo again")
})
}
func final(w http.ResponseWriter,r *http.Request) {
log.Println("Executing finalHandler")
w.Write([]byte("OK"))
}
func main() {
finalHandler := http.HandlerFunc(final)
http.Handle("/",middlewareOne(middlewareTwo(finalHandler)))
http.ListenAndServe(":8080",nil)
}
浏览器访问:http://localhost:8080/ 使用中间件检查请求体的存在 package main
import (
"bytes"
"net/http"
)
func enforceXMLHandler(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter,r *http.Request) {
// Check for a request body
if r.ContentLength == 0 {
http.Error(w,http.StatusText(400), 400)
return
}
// Check its MIME type
buf := new(bytes.Buffer)
buf.ReadFrom(r.Body)
if http.DetectContentType(buf.Bytes()) != "text/xml; charset=utf-8" {
http.Error(w,http.StatusText(415), 415)
return
}
next.ServeHTTP(w,r)
})
}
func main() {
finalHandler := http.HandlerFunc(final)
http.Handle("/",enforceXMLHandler(finalHandler))
http.ListenAndServe(":8080",nil)
}
func final(w http.ResponseWriter,r *http.Request) {
w.Write([]byte("OK"))
}
使用中间件写日志 package main
import (
"fmt"
"log"
"net/http"
"time"
)
func loggingHandle(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter,r *http.Request) {
t1 := time.Now()
next.ServeHTTP(w,r)
t2 := time.Now()
log.Printf("[%s] %q %vn",r.Method,r.URL.String(),t2.Sub(t1))
}
return http.HandlerFunc(fn)
}
func aboutHandler(w http.ResponseWriter,r *http.Request) {
fmt.Fprintf(w,"you are on about page")
}
func main() {
aboutHandler := http.HandlerFunc(aboutHandler)
http.Handle("/",loggingHandle(aboutHandler))
http.ListenAndServe(":8080",nil)
}
浏览器访问:http://localhost:8080/ goji/httpauthHTTP Authentication middlewares 获取: package main
import (
"net/http"
"github.com/goji/httpauth"
)
func main() {
finalHandler := http.HandlerFunc(final)
authHandler := httpauth.SimpleBasicAuth("username","password")
http.Handle("/",authHandler(finalHandler))
http.ListenAndServe(":8080",r *http.Request) {
w.Write([]byte("OK"))
}
curl测试: curl --i username:password@localhost:8080
HTTP/1.1 200 OK
Date: Thu,01 Feb 2018 05:27:33 GMT
Content-Length: 2
Content-Type: text/plain; charset=utf-8
OK
gorilla/handlers请参考: package main
import (
"github.com/gorilla/handlers"
"net/http"
"os"
)
func main() {
finalHandler := http.HandlerFunc(final)
logFile,err := os.OpenFile("server.log",os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
panic(err)
}
http.Handle("/",handlers.LoggingHandler(logFile,finalHandler))
http.ListenAndServe(":3000",r *http.Request) {
w.Write([]byte("OK"))
}
justinas/alicePainless middleware chaining for Go github地址: 获取: To start you call New() passing in each handler you want to execute,in the order that you want them to execute. That returns a structure off which you will call Then(),which tells Alice the final handler that must execute,which needs to be our router. This sample assumes the logger middleware function we setup previously is in a directory named middleware. func NewHttpServer(address string,port int) *http.Server {
router := setupHttpRouter()
server := alice.New(middleware.Logger).Then(router)
listener := &http.Server{
Addr: fmt.Sprintf("%s:%d",address,port),Handler: server,}
return listener
}
urfave/negroniIdiomatic HTTP Middleware for Golang github地址: 获取: negroni.Classic()
官方例子: package main
import (
"fmt"
"net/http"
"github.com/urfave/negroni"
)
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() // Includes some default middlewares
n.UseHandler(mux)
http.ListenAndServe(":3000",n)
}
关于negroni,之后会更加详细的介绍。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |