英文:
Passing a query parameter to the Go HTTP request handler using the MUX package
问题
我正在尝试将一个额外的参数传递到我发送给Go服务器的请求中 -
websocket.create_connection("ws://
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) {
// 查找Authorization头部
if ah := req.Header.Get("Authorization"); ah != "" {
// 应该是一个Bearer令牌
if len(ah) > 6 && strings.ToUpper(ah[0:6]) == "BEARER" {
return Parse(ah[7:], keyFunc)
}
}
// 查找"access_token"参数
req.ParseMultipartForm(10e6)
if tokStr := req.Form.Get("access_token"); tokStr != "" {
return Parse(tokStr, keyFunc)
}
return nil, ErrNoTokenInRequest
}
英文:
I am trying to pass an additional parameter in the request I am trying to send to the Go server -
websocket.create_connection("ws://<ip>:port/x/y?token="qwerty")
The Go server implementation is as follows -
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":
}
})
}
How should I look and parse for the token in the Go server so that the authentication is successful?
Library function
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
}
答案1
得分: 16
调用FormValue来获取查询参数:
token := req.FormValue("token")
其中,req
是*http.Request
类型的变量。
另一种方法是调用ParseForm并直接访问req.Form
:
if err := req.ParseForm(); err != nil {
// 处理错误
}
token := req.Form.Get("token")
在评论中,OP问如何将"token"
映射到外部包所需的"access_token"
。在调用外部包之前,执行以下代码:
if err := req.ParseForm(); err != nil {
// 处理错误
}
req.Form["access_token"] = req.Form["token"]
当外部包调用req.Form.Get("access_token")
时,它将得到与"token"
参数相同的值。
英文:
Call FormValue to get a query parameter:
token := req.FormValue("token")
req
is a the *http.Request
An alternative is to call ParseForm and access req.Form
directly:
if err := req.ParseForm(); err != nil {
// handle error
}
token := req.Form.Get("token")
The OP asks in a comment how to map "token"
to "access_token"
for an external package that's looking "access_token"
. Execute this code before calling the external package:
if err := req.ParseForm(); err != nil {
// handle error
}
req.Form["access_token"] = req.Form["token"]
When the external package calls req.Form.Get("access_token")
, it will get the same value as the "token"
parameter.
答案2
得分: 5
根据您想要解析令牌的方式,如果令牌来自表单或URL,则可以使用以下方法。
如果令牌是从表单中发送的,可以使用以下代码:
token := req.FormValue("token")
如果令牌是从URL中发送的,建议使用以下代码:
token := req.URL.Query().Get("token")
这对我来说是有效的。
英文:
Depending on the way you want to parse the token , if its coming from the form or the URL.
The first answer can be used if the token is being sent from the form while in case of a URL, I would suggest using this. This works for me
token := req.URL.Query().Get("token")
答案3
得分: 0
对于URL查询参数:
mux.Vars(r)["token"]
英文:
For url query parameters:
mux.Vars(r)["token"]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论