猿问

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

我试图在我试图发送到 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


}


拉丁的传说
浏览 209回答 3
3回答

慕森卡

调用FormValue获取查询参数:token := req.FormValue("token")req 是一个 *http.Request另一种方法是调用ParseForm并req.Form直接访问:if err := req.ParseForm(); err != nil {&nbsp; &nbsp;// handle error}token := req.Form.Get("token")OP 在评论中询问如何映射"token"到"access_token"正在查找的外部包"access_token"。在调用外部包之前执行此代码:if err := req.ParseForm(); err != nil {&nbsp; &nbsp;// handle error}req.Form["access_token"] = req.Form["token"]当外部包调用时req.Form.Get("access_token"),它会得到与"token"参数相同的值。

慕雪6442864

取决于您想要解析令牌的方式,如果它来自表单或 URL。如果令牌是从表单发送的,则可以使用第一个答案,而在 URL 的情况下,我建议使用它。这对我有用token&nbsp;:=&nbsp;req.URL.Query().Get("token")

PIPIONE

对于 url 查询参数:mux.Vars(r)["token"]
随时随地看视频慕课网APP

相关分类

Go
我要回答