गो के http पैकेज में, मैं POST अनुरोध पर क्वेरी स्ट्रिंग कैसे प्राप्त करूं?


114

मैं httpPOST अनुरोध से निपटने के लिए Go से पैकेज का उपयोग कर रहा हूं । मैं Requestऑब्जेक्ट से क्वेरी स्ट्रिंग की सामग्री को कैसे एक्सेस और पार्स कर सकता हूं ? मुझे आधिकारिक दस्तावेज से जवाब नहीं मिला।


एक बात का ध्यान रखें, यदि आप अनुरोध भेजने के लिए cURL का उपयोग कर रहे हैं और आप r.FormValue("id")एक क्वेरी परम प्राप्त करने के लिए उपयोग करते हैं, तो आप मुझे cURL में डेटा फॉर्म के माध्यम से नहीं भेज सकते हैं (अर्थात, curl 0.0.0.0:8888 -d id=foobarकाम नहीं करेगा)। आपको इसे क्वेरी परमेस ( curl 0.0.0.0:8888?id=foobar) के माध्यम से भेजना होगा ।

जवाबों:


145

परिभाषा में, URL में एक QueryString है । आप req.URL( doc ) का उपयोग करके अनुरोध के URL तक पहुँच सकते हैं । URL ऑब्जेक्ट में एक Query()विधि ( डॉक ) है जो एक Valuesप्रकार का रिटर्न देता है , जो कि केवल map[string][]stringQueryString मापदंडों का है।

यदि आप जिस चीज की तलाश कर रहे हैं वह HTML फॉर्म के द्वारा प्रस्तुत किया गया POST डेटा है , तो यह (आमतौर पर) अनुरोध बॉडी में एक महत्वपूर्ण-मूल्य वाला जोड़ा है। आप अपने उत्तर में सही हैं कि आप कॉल कर सकते हैं ParseForm()और फिर req.Formकुंजी-मूल्य जोड़े के मानचित्र को प्राप्त करने के लिए फ़ील्ड का उपयोग कर सकते हैं, लेकिन आप FormValue(key)किसी विशिष्ट कुंजी का मान प्राप्त करने के लिए भी कॉल कर सकते हैं । ParseForm()यदि आवश्यक हो तो यह कॉल करता है, और मानों की परवाह किए बिना कि उन्हें कैसे भेजा गया था (यानी क्वेरी स्ट्रिंग या अनुरोध निकाय में)।


2
पूर्वाग्रहों के लिए धन्यवाद।
फाबिन

2
मैं 'req.FormValue (कुंजी)' विधि को और अधिक तेज़ी से ढूँढता हूँ और आपके लिए url को प्री पार्स करने के लिए सभी आवश्यक कोड करता हूँ।
OnlyAngel

6
req.URL.RawQuery?एक GET अनुरोध पर सब कुछ देता है , अगर वह मदद करता है।
कॉटन

मैंने पाया कि यह दिलचस्प req.Form खाली सरणी है जब तक कि req.formValue ("some_field") को एक बार पट्टे पर नहीं लिया जाता है।
कियान चेन

अनेक अनेक धन्यवाद! @kouton
आदित्य वर्मा

127

जीईटी मापदंडों का उपयोग कैसे करें, इसका अधिक ठोस उदाहरण यहां दिया गया है। Requestवस्तु एक विधि है जो उनके लिए आप बुलाया बाहर पार्स करता है क्वेरी :

Http: // host: port / something; जैसे अनुरोध URL को मान लें ? Param1 = b

func newHandler(w http.ResponseWriter, r *http.Request) {
  fmt.Println("GET params were:", r.URL.Query())

  // if only one expected
  param1 := r.URL.Query().Get("param1")
  if param1 != "" {
    // ... process it, will be the first (only) if multiple were given
    // note: if they pass in like ?param1=&param2= param1 will also be "" :|
  }

  // if multiples possible, or to process empty values like param1 in
  // ?param1=&param2=something
  param1s := r.URL.Query()["param1"]
  if len(param1s) > 0 {
    // ... process them ... or you could just iterate over them without a check
    // this way you can also tell if they passed in the parameter as the empty string
    // it will be an element of the array that is the empty string
  }    
}

यह भी ध्यान दें कि "मान मानचित्र में कुंजियाँ [यानी क्वेरी () वापसी मान] केस-संवेदी हैं।"


4
पहले से बताए गए एक पिछले उत्तर और करने के डॉक्स से जुड़ा हुआ है (और इसका एक उदाहरण नहीं है कि सीमा के बाहर एक स्लाइस संदर्भ से घबरा जाएगा यदि वांछित क्षेत्र मौजूद नहीं है, तो r.URL.Query().Get("moviename")इस घातक गलती से बचने के लिए उपयोग करें)।
डेव सी

1
जानकारी के लिए धन्यवाद। हाँ, डॉक्स मेरे लिए थोड़ा भ्रमित कर रहे हैं, इसलिए मैंने इसे "उदाहरण पर हाथ" के रूप में उपयोगी होने के मामले में पोस्ट किया है। निल की जाँच निश्चित। Getविधि का उपयोग केवल पहले देता है अगर कई हैं, तो यह अधिक का एक उदाहरण है। उपयोगी जानकारी, धन्यवाद!
रोज़गारपैक

इसके अलावा, मुझे नहीं लगता कि आप किसी स्ट्रिंग की तुलना nil से कर सकते हैं: devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang यानी string! = "" मान्य है
जेम्स मिलनर

मुझे नहीं लगता कि वह कोड संकलित होगा, उदाहरण पूर्ण थे। आप उस खाली स्ट्रिंग की तुलना नहीं कर सकते, जो Values.Get()साथ लौटती है nilgolang.org/pkg/net/url/#Values
डैनियल फैरेल

19

नीचे एक उदाहरण है:

value := r.FormValue("field")

अधिक जानकारी के लिए। http पैकेज के बारे में, आप इसके प्रलेखन पर जा सकते हैंFormValueमूल रूप से POST या PUT मान, या GET मान लौटाता है, उस क्रम में, जो पहले मिल जाता है।


8

यहाँ एक सरल, काम करने का उदाहरण दिया गया है:

package main

import (
    "io"
    "net/http"
)
func queryParamDisplayHandler(res http.ResponseWriter, req *http.Request) {
    io.WriteString(res, "name: "+req.FormValue("name"))
    io.WriteString(res, "\nphone: "+req.FormValue("phone"))
}

func main() {
    http.HandleFunc("/example", func(res http.ResponseWriter, req *http.Request) {
        queryParamDisplayHandler(res, req)
    })
    println("Enter this in your browser:  http://localhost:8080/example?name=jenny&phone=867-5309")
    http.ListenAndServe(":8080", nil)
}

यहां छवि विवरण दर्ज करें


6

क्वेरी परम प्राप्त करने के दो तरीके हैं:

  1. Reqeust.URL.Query () का उपयोग करना
  2. अनुरोध का उपयोग कर

दूसरे मामले में किसी को सावधान रहना होगा क्योंकि बॉडी पैरामीटर क्वेरी पैरामीटर पर पूर्वता लेंगे। क्वेरी परम प्राप्त करने के बारे में एक पूरा विवरण यहां पाया जा सकता है

https://golangbyexample.com/net-http-package-get-query-params-golang


5

नीचे शब्द आधिकारिक दस्तावेज से आए हैं।

फॉर्म में पार्स फॉर्म डेटा होता है, जिसमें URL फ़ील्ड के क्वेरी पैरामीटर और POST या PUT फॉर्म डेटा दोनों शामिल होते हैं । यह फ़ील्ड केवल ParseForm कहे जाने के बाद उपलब्ध है।

इसलिए, नीचे दिए गए नमूने कोड काम करेंगे।

func parseRequest(req *http.Request) error {
    var err error

    if err = req.ParseForm(); err != nil {
        log.Error("Error parsing form: %s", err)
        return err
    }

    _ = req.Form.Get("xxx")

    return nil
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.