使用 MUX 包将查询参数传递给 Go HTTP 请求处理程序
Passing a query parameter to the Go HTTP request handler using the MUX package
我试图在发送到 Go 服务器的请求中传递一个附加参数 -
websocket.create_connection("ws://<ip>:port/x/y?token="qwerty")
Go服务器实现如下 -
func main() {
err := config.Parse()
if err != nil {
glog.Error(err)
os.Exit(1)
return
}
flag.Parse()
defer glog.Flush()
router := mux.NewRouter()
http.Handle("/", httpInterceptor(router))
router.Handle("/v1/x", common.ErrorHandler(stats.GetS)).Methods("GET")
router.Handle("/v1/x/y", common.ErrorHandler(stats.GetS)).Methods("GET")
var listen = fmt.Sprintf("%s:%d", config.Config.Ip, config.Config.Port)
err = http.ListenAndServe(listen, nil)
if err != nil {
glog.Error(err)
os.Exit(1)
}
}
func httpInterceptor(router http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
startTime := time.Now()
if !auth.Auth(w, req) {
http.Error(w, "Failed authentication", 401)
return
}
router.ServeHTTP(w, req)
finishTime := time.Now()
elapsedTime := finishTime.Sub(startTime)
switch req.Method {
case "GET":
case "POST":
}
})
}
我应该如何在 Go 服务器中查找和解析令牌以便身份验证成功?
库函数
func ParseFromRequest(req *http.Request, keyFunc Keyfunc) (token *Token, err error) {
// Look for an Authorization header
if ah := req.Header.Get("Authorization"); ah != "" {
// Should be a bearer token
if len(ah) > 6 && strings.ToUpper(ah[0:6]) == "BEARER" {
return Parse(ah[7:], keyFunc)
}
}
// Look for "access_token" parameter
req.ParseMultipartForm(10e6)
if tokStr := req.Form.Get("access_token"); tokStr != "" {
return Parse(tokStr, keyFunc)
}
return nil, ErrNoTokenInRequest
}
调用FormValue获取查询参数:
token := req.FormValue("token")
req
是一个*http.Request
另一种方法是调用 ParseForm 并直接访问 req.Form
:
if err := req.ParseForm(); err != nil {
// handle error
}
token := req.Form.Get("token")
OP 在评论中询问如何将 "token"
映射到 "access_token"
寻找 "access_token"
的外部包。在调用外部包之前执行此代码:
if err := req.ParseForm(); err != nil {
// handle error
}
req.Form["access_token"] = req.Form["token"]
外部包调用req.Form.Get("access_token")
时,会得到与"token"
参数相同的值
取决于您要解析令牌的方式,它来自表单还是 URL。
如果令牌是从表单发送的,则可以使用第一个答案,而如果是 URL,我建议使用这个。这对我有用
token := req.URL.Query().Get("token")
对于url个查询参数:
mux.Vars(r)["token"]
我试图在发送到 Go 服务器的请求中传递一个附加参数 -
websocket.create_connection("ws://<ip>:port/x/y?token="qwerty")
Go服务器实现如下 -
func main() {
err := config.Parse()
if err != nil {
glog.Error(err)
os.Exit(1)
return
}
flag.Parse()
defer glog.Flush()
router := mux.NewRouter()
http.Handle("/", httpInterceptor(router))
router.Handle("/v1/x", common.ErrorHandler(stats.GetS)).Methods("GET")
router.Handle("/v1/x/y", common.ErrorHandler(stats.GetS)).Methods("GET")
var listen = fmt.Sprintf("%s:%d", config.Config.Ip, config.Config.Port)
err = http.ListenAndServe(listen, nil)
if err != nil {
glog.Error(err)
os.Exit(1)
}
}
func httpInterceptor(router http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
startTime := time.Now()
if !auth.Auth(w, req) {
http.Error(w, "Failed authentication", 401)
return
}
router.ServeHTTP(w, req)
finishTime := time.Now()
elapsedTime := finishTime.Sub(startTime)
switch req.Method {
case "GET":
case "POST":
}
})
}
我应该如何在 Go 服务器中查找和解析令牌以便身份验证成功?
库函数
func ParseFromRequest(req *http.Request, keyFunc Keyfunc) (token *Token, err error) {
// Look for an Authorization header
if ah := req.Header.Get("Authorization"); ah != "" {
// Should be a bearer token
if len(ah) > 6 && strings.ToUpper(ah[0:6]) == "BEARER" {
return Parse(ah[7:], keyFunc)
}
}
// Look for "access_token" parameter
req.ParseMultipartForm(10e6)
if tokStr := req.Form.Get("access_token"); tokStr != "" {
return Parse(tokStr, keyFunc)
}
return nil, ErrNoTokenInRequest
}
调用FormValue获取查询参数:
token := req.FormValue("token")
req
是一个*http.Request
另一种方法是调用 ParseForm 并直接访问 req.Form
:
if err := req.ParseForm(); err != nil {
// handle error
}
token := req.Form.Get("token")
OP 在评论中询问如何将 "token"
映射到 "access_token"
寻找 "access_token"
的外部包。在调用外部包之前执行此代码:
if err := req.ParseForm(); err != nil {
// handle error
}
req.Form["access_token"] = req.Form["token"]
外部包调用req.Form.Get("access_token")
时,会得到与"token"
参数相同的值
取决于您要解析令牌的方式,它来自表单还是 URL。
如果令牌是从表单发送的,则可以使用第一个答案,而如果是 URL,我建议使用这个。这对我有用
token := req.URL.Query().Get("token")
对于url个查询参数:
mux.Vars(r)["token"]