第一次链接功能

注册

假设我想在运行针对HTTP服务器的自定义多路复用器之前先运行记录器。

在那儿,我可以链接记录器并添加这样的自定义多路复用器:https : //play.golang.org/p/Edurl-Rhqb9

package main

import (
    "fmt"
    "net/http"
    "time"

    "github.com/julienschmidt/httprouter"
)

type Middleware func(http.HandlerFunc) http.HandlerFunc

func ServeHTTPIterator(h http.HandlerFunc, m ...Middleware) http.HandlerFunc {
    if len(m) < 1 {
        return h
    }
    wrapped := h

    // loop in reverse to preserve middleware order
    for i := len(m) - 1; i >= 0; i-- {
        wrapped = m[i](wrapped)
    }
    return wrapped
}

func IndexHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello Index!")
}

func LogFirst(h http.HandlerFunc) http.HandlerFunc {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Print(`First`)
        h.ServeHTTP(w, r)
    })
}

func LogSecond(h http.HandlerFunc) http.HandlerFunc {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Print(`Second`)
        h.ServeHTTP(w, r)
    })
}

func main() {
    httpServer := &http.Server{
        Addr:         `my.local:8080`,
        ReadTimeout:  5 * time.Second,
        WriteTimeout: 5 * time.Second,
        IdleTimeout:  5 * time.Second,
    }

    var Router *httprouter.Router

    preMiddle := []Middleware{
        LogFirst,
        LogSecond,
    }

    http.HandleFunc("/", ServeHTTPIterator(IndexHandler, preMiddle...))

    httpServer.Handler = Router
}

但是现在假设我想在记录器之后运行多路复用器,在那种情况下,我想我会做类似的事情:

    preMiddle := []Middleware{
        LogFirst,
        LogSecond,
        Router,
    }

但是我不确定如何包装Router来完成这项工作,或者这是否合法。有人可以告诉我我在这里缺少什么吗?

樱桃柠檬

修改代码以使用http.Handler而不是http.HandlerFunc。

type Middleware func(http.Handler) http.Handler

func ServeHTTPIterator(h http.Handler, m ...Middleware) http.Handler {
    if len(m) < 1 {
        return h
    }
    wrapped := h

    // loop in reverse to preserve middleware order
    for i := len(m) - 1; i >= 0; i-- {
        wrapped = m[i](wrapped)
    }
    return wrapped
}
    
func LogFirst(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Print(`First`)
        h.ServeHTTP(w, r)
    })
}

func LogSecond(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Print(`Second`)
        h.ServeHTTP(w, r)
    })
}

创建路由器并向路由器注册处理程序。将参数参数添加到IndexHandler,以便该功能与httprouter兼容。

router := httprouter.New()
router.GET("/", IndexHandler)

使用新版本的ServeHTTPIterator包装路由器。

httpServer.Handler = ServeHTTPIterator(router, preMiddle...)

通过这些更改,将在调用路由器之前写入日志。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

第一次后无法点击链接

来自分类Dev

使功能第一次使用Tkinter单击后只能运行一次吗?

来自分类Dev

第一次接触被忽略?

来自分类Dev

第一次击球太快

来自分类Dev

第一次通过成语

来自分类Dev

广度第一次迭代?

来自分类Dev

第一次流浪失败

来自分类Dev

第一次安装Ubuntu

来自分类Dev

第一次运行jstree

来自分类Dev

广度第一次迭代?

来自分类Dev

动画是第一次

来自分类Dev

第一次接触被忽略?

来自分类Dev

HTTPAsyncClient第一次跳过

来自分类Dev

第一次使用Mockito

来自分类Dev

摩卡第一次测试

来自分类Dev

第一次加载页面

来自分类Dev

第一次击球太快

来自分类Dev

组件的第一次更新

来自分类Dev

Laravel - 第一次使用

来自分类Dev

第一次安装 Ubuntu

来自分类Dev

.on更改功能是第一次而不是第二次起作用?

来自分类Dev

WPF DocumentViewer:第一次单击时使用内部链接导航不正确

来自分类Dev

我从链接访问页面时第一次没有执行Javascript

来自分类Dev

CSS:选择包含特定单词的链接的第一次出现

来自分类Dev

当页面第一次在编辑链接上加载时,如何保存值?

来自分类Dev

第一次单击后从链接取消引导3模态调用

来自分类Dev

锚链接偏移仅在第一次单击时不起作用

来自分类Dev

在 lisp 中第一次搜索下的前向链接

来自分类Dev

部分应用的功能只能在第一次使用。