我对可能是一个简单问题的问题深恶痛绝。我需要用呼叫第三方CAS授权服务来结束功能。我使用go-ca来实现这一点,直到我开始添加路由要求,它才起作用。我选择了朱利安·施密特的“Schmidt”,不知怎么的,我也需要让它与围棋一起工作。
如果我没有弄错的话,我需要使用某种定制的中间件来从处理程序转到处理程序。我认为这条链应该是这样的:
http.Handler -> func(http.ResponseWriter,*http.Request,httprouter.Params)
...the首先是CAS想要的,第二个是httprouter想要的。但是我现在太迷茫了,以至于我无法确定该做什么。
谢谢你的建议!
在下面的代码中,调用..。
router.Handler("GET", "/", client.HandleFunc(defaultHandler))..。产生此错误:
不能将defaultHandler (类型func(http.ResponseWriter,*http.Request,httprouter.Params))用作client.HandleFunc参数中的func(http.ResponseWriter,*http.Request)类型
以下是不工作的代码:
package main
import (
"fmt"
"log"
"net/http"
"strings"
"time"
"github.com/go-cas/cas"
"github.com/julienschmidt/httprouter"
)
func defaultHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
if !cas.IsAuthenticated(r) {
cas.RedirectToLogin(w, r)
}
pageID := ps.ByName("pageID")
type pageModel struct {
Title string
PageID string
}
model := pageModel{
Title: "Seminars",
PageID: pageID,
}
render.ToBrowser(w, "views/index.html", &model)
}
func main() {
u, _ := url.Parse("https://cas_example_server.com")
client := cas.NewClient(&cas.Options{
URL: u,
})
router := httprouter.New()
//This line fails with the message:
//"Cannot use defaultHandler (type func(http.ResponseWriter, *http.Request, httprouter.Params))
//as type func(http.ResponseWriter, *http.Request) in argument to client.HandleFunc"
router.Handler("GET", "/", client.HandleFunc(defaultHandler))
err := http.ListenAndServe(":8080", router)
if err != nil {
panic(err)
}
}发布于 2017-09-27 12:31:14
中间件可以使用请求上下文将数据传递给具有不同签名的处理程序:
import (
"net/http"
"net/url"
"github.com/go-cas/cas"
"github.com/julienschmidt/httprouter"
"golang.org/x/net/context"
)
func defaultHandler(w http.ResponseWriter, r *http.Request) {
if !cas.IsAuthenticated(r) {
cas.RedirectToLogin(w, r)
}
ps := r.Context().Value("params").(httprouter.Params)
// business logic
}
func main() {
u, _ := url.Parse("https://cas_example_server.com")
client := cas.NewClient(&cas.Options{
URL: u,
})
router := httprouter.New()
//This line fails with the message:
//"Cannot use defaultHandler (type func(http.ResponseWriter, *http.Request, httprouter.Params))
//as type func(http.ResponseWriter, *http.Request) in argument to client.HandleFunc"
router.Handler("GET", "/", func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
newContext := context.WithValue(r.Context(), "params", ps)
r.WithContext(newContext)
client.HandleFunc(defaultHandler)(w, r)
})
err := http.ListenAndServe(":8080", router)
if err != nil {
panic(err)
}
}更新:有许多有用的库来保存您的https://github.com/urfave/negroni处理程序堆栈
https://stackoverflow.com/questions/46433817
复制相似问题