【问题标题】:http HandleFunc argument in golanggolang中的http HandleFunc参数
【发布时间】:2015-11-21 08:45:04
【问题描述】:

我想使用速率限制或限制器库来限制客户端请求的数量。我在我的代码库中使用了供应商库。我想传入ResponseWriterRequest 和从 URL 中检索到的第三个变量。当我使用该库进行节流时,它会返回一个只处理两个参数的处理程序。如何将第三个参数传递给处理程序?

这是我当前的代码:

package main

import (
    "fmt"
    "github.com/didip/tollbooth"
    "net/http"
    )

func viewHandler(
    w http.ResponseWriter, 
    r *http.Request, 
    uniqueId string,
    ) {
    //data := getData(uniqueId)
    fmt.Println("Id:", uniqueId)
    p := &objects.ModelApp{LoggedUser: "Ryan Hardy", ViewData: "data"}
    renderTemplate(w, "view", p)
}

//URL validation for basic web services
var validPath = regexp.MustCompile("^/$|/(home|about|view)/(|[a-zA-Z0-9]+)$")

func makeHandler(
    fn func(
        http.ResponseWriter, 
        *http.Request, string,
        )) http.HandlerFunc {
    return func(
        w http.ResponseWriter, 
        r *http.Request,
        ) {
        m := validPath.FindStringSubmatch(r.URL.Path)
        if m == nil {
            http.NotFound(w, r)
            return
        }
        fn(w, r, m[2])
    }
}

func main() {
    http.Handle("/view/", makeHandler(tollbooth.LimitFuncHandler(tollbooth.NewLimiter(1, time.Second), viewHandler)))
    http.ListenAndServe(":8080", nil)
}

谁能帮我解决这个问题?

【问题讨论】:

  • 您的错误可能来自这一行 - fn(w, r, m[2]) - 这是因为该签名与 http.HandleFunc 的签名不匹配。使用像gorilla/mux 这样的路由器来处理与处理程序分开的正则表达式/路径匹配,然后通过fn(w, r) 返回一个普通的http.HandlerFunc,你会得到更好的服务。
  • 是的。但是我在没有使用这些包的情况下开发了应用程序。再次使用这些软件包将是我必须做出的重大改变。我试图使用一个需要 2 个输入和节流阀的虚拟处理程序。然后将其传递给 makeHandler 函数并作为 3 个参数返回。但这种方法无法成功。有没有类似的方法可以做到这一点?

标签: go httprequest handler


【解决方案1】:

我在手机上,所以这可能很难输入,但您可以使用http.Handle 函数,它采用Handler 之类的接口

type makeHandler struct {
    YourVariable string
}

func (m *makeHandler) ServeHTTP (w http.ResponseWriter, r *http.Request) {
    yourVariableYouNeed := m.YourVariable
    // do whatever 
    w.Write()
}

// do whatever you need to get your variable
blah := &makeHandler{ yourThing }

http.Handle("/views", blah)

在我的手机上,所以无法测试,但它应该可以工作,如果没有,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    相关资源
    最近更新 更多