【发布时间】:2015-11-21 08:45:04
【问题描述】:
我想使用速率限制或限制器库来限制客户端请求的数量。我在我的代码库中使用了供应商库。我想传入ResponseWriter、Request 和从 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