2015-01-26 10 views
7

मैं अनुरोध मैं गो सर्वर को भेजने के लिए कोशिश कर रहा हूँ में एक अतिरिक्त पैरामीटर पारित करने के लिए कोशिश कर रहा हूँ का उपयोग कर जाओ HTTP अनुरोध हैंडलर के लिए एक क्वेरी पैरामीटर पासिंग निम्नानुसार -MUX पैकेज

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": 
     } 

    }) 
} 

मुझे गो सर्वर में टोकन के लिए कैसे दिखना चाहिए और पार्स करना चाहिए ताकि प्रमाणीकरण सफल हो?

token := req.FormValue("token") 

req एक *http.Request

एक वैकल्पिक ParseForm और पहुँच req.Form सीधे कॉल करने के लिए है:

लाइब्रेरी समारोह

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 

} 

उत्तर

14

कॉल FormValue एक क्वेरी पैरामीटर प्राप्त करने के लिए:

if err := req.ParseForm(); err != nil { 
    // handle error 
} 
token := req.Form.Get("token") 

ओपी एक टिप्पणी में पूछता है कि "access_token" देख रहे बाहरी पैकेज के लिए "accessken" को "access_token" कैसे मैप करना है। बाहरी पैकेज कॉल करने से पहले इस कोड को निष्पादित करें:

if err := req.ParseForm(); err != nil { 
    // handle error 
} 
req.Form["access_token"] = req.Form["token"] 

बाहरी पैकेज की आवश्यकता होने पर req.Form.Get("access_token"), यह "टोकन" पैरामीटर के रूप में एक ही मूल्य मिल जाएगा।

+0

कैसे के बारे में मैं कुछ इस तरह का उपयोग करें - टोकन: = req.URL.Query() जाओ ("टोकन") – psbits

+0

कूल। , धन्यवाद, मैं उपरोक्त कोड में उपयोग किए जाने वाले औथ फ़ंक्शन में इस टोकन पैरामीटर में कैसे पास करूं? एक और सवाल यह है कि बाहरी पुस्तकालय जिसका उपयोग मैं कर रहा हूं "access_token" पैरामीटर और मेरे सर्वर कोड में, मैं इस तर्क को "टोकन" पैरामीटर को संभालने के लिए जोड़ूंगा। मैं "टोकन" को "Access_token" में आंतरिक रूप से कैसे मैप कर सकता हूं ताकि पुस्तकालय अनुरोध में पारित इस टोकन को सफलतापूर्वक प्रमाणित कर सके? – psbits

+0

पुस्तकालय क्वेरी पैरामीटर कैसे प्राप्त करता है? क्या यह req.Form का उपयोग करता है? –

4

टोकन को पार्स करना चाहते हैं, जिस पर आप फॉर्म या यूआरएल से आते हैं।

यूआरएल के मामले में टोकन फॉर्म से भेजे जाने पर पहला जवाब इस्तेमाल किया जा सकता है, तो मैं इसका उपयोग करने का सुझाव दूंगा। इस के लिए मुझे

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

[क्वेरी] (http://godoc.org/net/url#URL.Query) विधि प्रत्येक बार विधि कहने पर क्वेरी स्ट्रिंग को पार करती है। पसंदीदा एपोरैच [ParseForm] (http://godoc.org/net/http#Request.ParseForm) को कॉल करके और अनुरोध [पार्स] (http: // godoc) में पार्स किए गए पैरामीटर तक पहुंचकर क्वेरी स्ट्रिंग को एक बार पार्स करना है। संगठन/नेट/http # Request.Form) फ़ील्ड। [FormValue] (http://godoc.org/net/http#Request.FormValue) एक उपयोगी सहायक विधि है जो इन दो चरणों को जोड़ती है। –

0

काम करता है URL क्वेरी पैरामीटर के लिए:

mux.Vars(r)["token"] 
संबंधित मुद्दे