如何在不使用DefaultServeMux的情况下实现HandlerFunc

BrainLikeADullPencil:

如果我要使用DefaultServeMux(我通过将其nil作为第二个参数传递给ListenAndServe来指定),那么我可以访问http.HandleFunc,您可以从Go Wiki的以下示例中看到它:

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

在我当前的代码中,我无法使用DefaultServeMux,即我正在将自定义处理程序传递给ListenAndServe

    h := &mypackage.Handler{
        Database: mydb
    }
    http.ListenAndServe(":8080", h)

因此我没有http.HandleFunc内置的代码。但是,我必须将一些授权代码修改为需要类似的授权代码http.HandleFunc例如,如果我一直在使用DefaultServeMux,则当我点击"/protected"路线时,我想转到Protected处理程序,但仅在经过h.AuthorizationHandlerFunc这样处理之后

   h.AuthorizationHandlerFunc(Protected)

但是,由于我没有使用DefaultServeMux,因此无法正常工作,即无法将Protected函数(并调用它)传递给AuthorizationHandlerFunc这是下面的AuthorizationHandlerFunc的实现。您可以在下面看到Protected永不被调用。

问题:HandlerFunc在这种情况下(不使用DefaultServeMux)如何实现

func (h *Handler) AuthorizationHandlerFunc(next http.HandlerFunc) http.Handler{
     return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
         h.AuthorizationMiddleWare(w, r, next)
   })
}

func (h *Handler) AuthorizationMiddleWare(w http.ResponseWriter, r *http.Request, next http.HandlerFunc){
     //other stuff happens
     log.Println("this is never getting called")
     next(w,r)
}
func (h *Handler)Protected(w http.ResponseWriter, r *http.Request){

      log.Println("this is never getting called")
}

更新 ServeHTTP在mypackage.Handler上实现。为什么未调用Protected函数,或者为何未在AuthorizationMiddleWare中调用相关代码?

elithrar:

将您的授权中间件重新实现为http.Handler

type auth struct {
   DB *sql.DB
   UnauthorizedHandler http.Handler
}

func NewAuth(db *sql.DB, unauthorized http.Handler) *auth {
    return auth{db, unauthorized}
}

func (a *auth) Protected(h http.Handler) http.Handler {
    fn := func(w http.ResponseWriter, r *http.Request) {
        // Check whether the request is valid
        // If it's invalid, call your error func and make sure to *return* early!
        if !valid {
            a.UnauthorizedHandler.ServeHTTP(w, r)
            return
        }
        // Call the next handler on success
        h.ServeHTTP(w, r)
        return
    }

    return http.HandlerFunc(fn)
}

func someHandler(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "Hello!\n")
}

func main() {
    auth := NewAuth(db, errorHandler)
    r := http.NewServeMux()
    // We have a http.Handler implementation that wraps a http.HandlerFunc
    // ... so we call r.Handle on our ServeMux and type-cast the wrapped func
    r.Handle("/protected", auth.Protected(http.HandlerFunc(someHandler)))
    // Just a simple http.HandlerFunc here
    r.HandleFunc("/public", someOtherHandler)

    log.Fatal(http.ListenAndServe(":8000", r))
}

看一下为一个ServeHTTP方法的不同示例编写httpauth库以上和ServeHTTP在您的类型上显式创建方法都是有效的方法。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不使用抽象的情况下强制实现子类中的方法?

如何在不使用make的情况下使用cgo?

如何在不使用<br />的情况下从CSS换行?

如何在不使用JOIN的情况下实现SQL连接?

在不使用阵列控制器的情况下如何在Ember模型中实现排序?

如何在不使用SphereGeometry的情况下绘制Sphere?

如何在不使用$ scope的情况下使用$ emit / $ on?

如何在不使用图像的情况下实现带有阴影边框的弯曲标题

如何在不使用Setter的情况下使用Getter

如何在不使用div的情况下使iframe响应?

如何在不使用Webpack的情况下使用Babel

如何在不使用JPQL的情况下选择多行?

如何在不使用numpy在python中使用for循环的情况下实现矩阵映射?

如何在不使用循环的情况下多次打印?

如何在不使用xpath的情况下检查元素

如何在不使用sudo的情况下输入chroot?

如何在不使用@import的情况下减少@import?

如何在不使用Quartz的情况下安排任务

如何在不使用xml的情况下使用ViewPager?

如何在不使用mysql的情况下使用表

如何在不使用代理的情况下更改IP?

如何在不使用静态方法的情况下实现单例?

android如何在不使用setuid的情况下实现运行方式

如何在不使用AND的情况下从多行获取ID

Scala:如何在不使用 var 的情况下实现以下内容

如何在不使用 Firebase Cloud 功能的情况下实现推送通知?

如何在不使用负边距的情况下实现这种突出的图像布局?

如何在不使用 NOT IN 的情况下优化 SQL 查询

如何在不使用状态变量的情况下实现实时重新渲染?