为了账号安全,请及时绑定邮箱和手机立即绑定

如何将句柄转换为 HandleFunc?

如何将句柄转换为 HandleFunc?

Go
慕妹3242003 2021-09-10 15:06:19
我正在制作验证码并遵循此处给出的示例。我需要修改示例以使用 gorilla mux 的路由,因为我的应用程序的其余部分使用它。对于我的生活,我无法弄清楚如何正确地为该示例的第 47 行路由路径。我下面的结果没有生成验证码......(示例本身工作正常)。对于狗屎和傻笑,我什至尝试过“http.HandleFunc("/captcha/", captchaHandler)”,但这也不起作用。有什么建议?package mainimport (    "github.com/dchest/captcha"    "github.com/gorilla/mux"    "io"    "log"    "net/http"    "text/template")var formTemplate = template.Must(template.New("example").Parse(formTemplateSrc))func showFormHandler(w http.ResponseWriter, r *http.Request) {    if r.URL.Path != "/" {        http.NotFound(w, r)        return    }    d := struct {        CaptchaId string    }{        captcha.New(),    }    if err := formTemplate.Execute(w, &d); err != nil {        http.Error(w, err.Error(), http.StatusInternalServerError)    }}func processFormHandler(w http.ResponseWriter, r *http.Request) {    w.Header().Set("Content-Type", "text/html; charset=utf-8")    if !captcha.VerifyString(r.FormValue("captchaId"), r.FormValue("captchaSolution")) {        io.WriteString(w, "Wrong captcha solution! No robots allowed!\n")    } else {        io.WriteString(w, "Great job, human! You solved the captcha.\n")    }    io.WriteString(w, "<br><a href='/'>Try another one</a>")}func captchaHandler(w http.ResponseWriter, r *http.Request) {    captcha.Server(captcha.StdWidth, captcha.StdHeight)}type Routes []Routetype Route struct {    Method      string    Pattern     string    HandlerFunc http.HandlerFunc}func main() {    /*        http.HandleFunc("/", showFormHandler)        http.HandleFunc("/process", processFormHandler)        //http.HandleFunc("/captcha/", captchaHandler) // doesn't work        http.Handle("/captcha/", captcha.Server(captcha.StdWidth, captcha.StdHeight))        fmt.Println("Server is at localhost:8666")        if err := http.ListenAndServe(":8666", nil); err != nil {            log.Fatal(err)        }    */编辑#1:更清楚地说“不起作用”没有帮助。它返回 404 错误。编辑 #2:github 上的示例工作正常......只有当我修改路由时,当我尝试生成验证码时它返回 404。
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

您可以转换http.Handler h一到http.HandlerFunc使用方法表达式

h.ServeHTTP

您可以直接使用路由Handler方法注册 Handler,而不是转换为 HandlerFunc :

router.Methods("GET").Path("/captcha/").Handler(captcha.Server(captcha.StdWidth, captcha.StdHeight))

根据您的评论和编辑,我认为您需要前缀匹配而不是完全匹配:

router.Methods("GET").PathPrefix("/captcha/").Handler(captcha.Server(captcha.StdWidth, captcha.StdHeight))



查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信