Passing a query parameter to the Go HTTP request handler using the MUX package

huangapple go评论124阅读模式
英文:

Passing a query parameter to the Go HTTP request handler using the MUX package

问题

我正在尝试将一个额外的参数传递到我发送给Go服务器的请求中 -

websocket.create_connection("ws://:port/x/y?token="qwerty"")

Go服务器的实现如下 -

func main() {
err := config.Parse()
if err != nil {
glog.Error(err)
os.Exit(1)
return
}

  1. flag.Parse()
  2. defer glog.Flush()
  3. router := mux.NewRouter()
  4. http.Handle("/", httpInterceptor(router))
  5. router.Handle("/v1/x", common.ErrorHandler(stats.GetS)).Methods("GET")
  6. router.Handle("/v1/x/y", common.ErrorHandler(stats.GetS)).Methods("GET")
  7. var listen = fmt.Sprintf("%s:%d", config.Config.Ip, config.Config.Port)
  8. err = http.ListenAndServe(listen, nil)
  9. if err != nil {
  10. glog.Error(err)
  11. os.Exit(1)
  12. }

}

func httpInterceptor(router http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
startTime := time.Now()

  1. if !auth.Auth(w, req) {
  2. http.Error(w, "Failed authentication", 401)
  3. return
  4. }
  5. router.ServeHTTP(w, req)
  6. finishTime := time.Now()
  7. elapsedTime := finishTime.Sub(startTime)
  8. switch req.Method {
  9. case "GET":
  10. case "POST":
  11. }
  12. })

}

我应该如何查找和解析Go服务器中的令牌,以便进行成功的身份验证?

库函数

func ParseFromRequest(req *http.Request, keyFunc Keyfunc) (token *Token, err error) {

  1. // 查找Authorization头部
  2. if ah := req.Header.Get("Authorization"); ah != "" {
  3. // 应该是一个Bearer令牌
  4. if len(ah) > 6 && strings.ToUpper(ah[0:6]) == "BEARER" {
  5. return Parse(ah[7:], keyFunc)
  6. }
  7. }
  8. // 查找"access_token"参数
  9. req.ParseMultipartForm(10e6)
  10. if tokStr := req.Form.Get("access_token"); tokStr != "" {
  11. return Parse(tokStr, keyFunc)
  12. }
  13. return nil, ErrNoTokenInRequest

}

英文:

I am trying to pass an additional parameter in the request I am trying to send to the Go server -

  1. websocket.create_connection("ws://<ip>:port/x/y?token="qwerty")

The Go server implementation is as follows -

  1. func main() {
  2. err := config.Parse()
  3. if err != nil {
  4. glog.Error(err)
  5. os.Exit(1)
  6. return
  7. }
  8. flag.Parse()
  9. defer glog.Flush()
  10. router := mux.NewRouter()
  11. http.Handle("/", httpInterceptor(router))
  12. router.Handle("/v1/x", common.ErrorHandler(stats.GetS)).Methods("GET")
  13. router.Handle("/v1/x/y", common.ErrorHandler(stats.GetS)).Methods("GET")
  14. var listen = fmt.Sprintf("%s:%d", config.Config.Ip, config.Config.Port)
  15. err = http.ListenAndServe(listen, nil)
  16. if err != nil {
  17. glog.Error(err)
  18. os.Exit(1)
  19. }
  20. }
  21. func httpInterceptor(router http.Handler) http.Handler {
  22. return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
  23. startTime := time.Now()
  24. if !auth.Auth(w, req) {
  25. http.Error(w, "Failed authentication", 401)
  26. return
  27. }
  28. router.ServeHTTP(w, req)
  29. finishTime := time.Now()
  30. elapsedTime := finishTime.Sub(startTime)
  31. switch req.Method {
  32. case "GET":
  33. case "POST":
  34. }
  35. })
  36. }

How should I look and parse for the token in the Go server so that the authentication is successful?

Library function

  1. func ParseFromRequest(req *http.Request, keyFunc Keyfunc) (token *Token, err error) {
  2. // Look for an Authorization header
  3. if ah := req.Header.Get("Authorization"); ah != "" {
  4. // Should be a bearer token
  5. if len(ah) > 6 && strings.ToUpper(ah[0:6]) == "BEARER" {
  6. return Parse(ah[7:], keyFunc)
  7. }
  8. }
  9. // Look for "access_token" parameter
  10. req.ParseMultipartForm(10e6)
  11. if tokStr := req.Form.Get("access_token"); tokStr != "" {
  12. return Parse(tokStr, keyFunc)
  13. }
  14. return nil, ErrNoTokenInRequest
  15. }

答案1

得分: 16

调用FormValue来获取查询参数:

  1. token := req.FormValue("token")

其中,req*http.Request类型的变量。

另一种方法是调用ParseForm并直接访问req.Form

  1. if err := req.ParseForm(); err != nil {
  2. // 处理错误
  3. }
  4. token := req.Form.Get("token")

在评论中,OP问如何将"token"映射到外部包所需的"access_token"。在调用外部包之前,执行以下代码:

  1. if err := req.ParseForm(); err != nil {
  2. // 处理错误
  3. }
  4. req.Form["access_token"] = req.Form["token"]

当外部包调用req.Form.Get("access_token")时,它将得到与"token"参数相同的值。

英文:

Call FormValue to get a query parameter:

  1. token := req.FormValue("token")

req is a the *http.Request

An alternative is to call ParseForm and access req.Form directly:

  1. if err := req.ParseForm(); err != nil {
  2. // handle error
  3. }
  4. 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:

  1. if err := req.ParseForm(); err != nil {
  2. // handle error
  3. }
  4. 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,则可以使用以下方法。

如果令牌是从表单中发送的,可以使用以下代码:

  1. token := req.FormValue("token")

如果令牌是从URL中发送的,建议使用以下代码:

  1. 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

  1. token := req.URL.Query().Get("token")

答案3

得分: 0

对于URL查询参数:

  1. mux.Vars(r)["token"]
英文:

For url query parameters:

  1. mux.Vars(r)["token"]

huangapple
  • 本文由 发表于 2015年1月27日 05:59:37
  • 转载请务必保留本文链接:https://go.coder-hub.com/28159520.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定