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

使用 MUX 包将查询参数传递给 Go HTTP 请求处理程序

使用 MUX 包将查询参数传递给 Go HTTP 请求处理程序

Go
拉丁的传说 2021-09-13 10:53:56
我试图在我试图发送到 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}
查看完整描述

3 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

调用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"参数相同的值。


查看完整回答
反对 回复 2021-09-13
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

取决于您想要解析令牌的方式,如果它来自表单或 URL。

如果令牌是从表单发送的,则可以使用第一个答案,而在 URL 的情况下,我建议使用它。这对我有用

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


查看完整回答
反对 回复 2021-09-13
?
PIPIONE

TA贡献1829条经验 获得超9个赞

对于 url 查询参数:

mux.Vars(r)["token"]


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

添加回答

举报

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