एक GET अनुरोध कर जाओ और Querystring का निर्माण करो


85

मैं गो के लिए बहुत नया हूं और अभी तक सब कुछ नहीं समझ पाया हूं। कई आधुनिक भाषाओं में Node.js, Angular, jQuery, PHP आप अतिरिक्त क्वेरी स्ट्रिंग मापदंडों के साथ एक GET अनुरोध कर सकते हैं।

गो में ऐसा करना काफी सरल नहीं है क्योंकि ऐसा लगता है, और मैं वास्तव में इसे अभी तक समझ नहीं पाया हूं। मैं वास्तव में उन अनुरोधों में से प्रत्येक के लिए एक स्ट्रिंग नहीं करना चाहता हूं जो मैं करना चाहता हूं।

यहाँ नमूना स्क्रिप्ट है:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    client := &http.Client{}

    req, _ := http.NewRequest("GET", "http://api.themoviedb.org/3/tv/popular", nil)
    req.Header.Add("Accept", "application/json")
    resp, err := client.Do(req)

    if err != nil {
        fmt.Println("Errored when sending request to the server")
        return
    }

    defer resp.Body.Close()
    resp_body, _ := ioutil.ReadAll(resp.Body)

    fmt.Println(resp.Status)
    fmt.Println(string(resp_body))
}

इस उदाहरण में आप देख सकते हैं कि एक URL है, जिसे मूल्य के रूप में आपकी एपीआई कुंजी के साथ api_key के GET चर की आवश्यकता है। समस्या यह है कि यह कठिन कोड के रूप में हो जाता है:

req, _ := http.NewRequest("GET", "http://api.themoviedb.org/3/tv/popular?api_key=mySuperAwesomeApiKey", nil)

क्या इस क्वेरी स्ट्रिंग को गतिशील रूप से बनाने का कोई तरीका है ?? फिलहाल मुझे इस कदम से पहले एक वैध प्रतिक्रिया प्राप्त करने के लिए URL को इकट्ठा करने की आवश्यकता होगी।


1
तो एक स्ट्रिंग को बदलने में क्या गलत है?
साल्वाडोर डाली

4
मुझे लगता है कि कुछ भी नहीं है, लेकिन यह वास्तव में एक सुंदर विनम्रता नहीं है, बस सोचा कि गो में चीजों को करने का एक बेहतर तरीका है। आप क्रिया परिवर्तन, विधि देखते हैं और फिर आपको एक साथ सब कुछ स्ट्रिंग करना होगा।
रूडी स्ट्राइडम

2
आप उपयोग कर सकते हैं url.Valuesकी Encodeविधि। आप URL.Stringसंपूर्ण URL बनाने के लिए भी उपयोग कर सकते हैं ।
डेव सी

जवाबों:


208

एक टिप्पणीकार के रूप में आप एक विधि है जिसमें Valuesसे प्राप्त कर सकते हैं । आप ऐसा कुछ कर सकते हैं ( मौजूदा रिटर्न )net/urlEncodereq.URL.Query()url.Values

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

func main() {
    req, err := http.NewRequest("GET", "http://api.themoviedb.org/3/tv/popular", nil)
    if err != nil {
        log.Print(err)
        os.Exit(1)
    }

    q := req.URL.Query()
    q.Add("api_key", "key_from_environment_or_flag")
    q.Add("another_thing", "foo & bar")
    req.URL.RawQuery = q.Encode()

    fmt.Println(req.URL.String())
    // Output:
    // http://api.themoviedb.org/3/tv/popular?another_thing=foo+%26+bar&api_key=key_from_environment_or_flag
}

http://play.golang.org/p/L5XCrw9VIG


1
बहुत बढ़िया शुक्रिया यार! बिलकुल वही, जिसकी मुझे तलाश थी!
रुडी स्ट्राइडम

परीक्षण के लिए भी बढ़िया!
काइल चड्ढा

अपने वांछित क्रम में क्वेरी स्ट्रिंग पैरामीटर बनाने के लिए कोई समाधान? चाबियाँ Encode()विधि में क्रमबद्ध हैं ।
Artificerpi

1
@artificerpi यदि यह किसी कारण से महत्वपूर्ण था, तो आप इसे फिर से लागू कर सकते हैं कि वे एनकोड विधि golang.org/src/net/url/url.go?s=24222:24253#L845 के अंदर क्या करते हैं - मुझे आश्चर्य होगा कि यह क्यों हुआ।
jcbwlkr

3
यदि आपको इसके साथ कुछ नहीं करना है, तो आपको NewRequest का उपयोग करने की आवश्यकता नहीं है। आप url.Parse("https://something.com/")इसके बजाय बस उपयोग कर सकते हैं या सीधे URL ऑब्जेक्ट भी बना सकते हैं।
रिचर्ड

34

r.URL.Query()जब आप मौजूदा क्वेरी से जुड़ रहे हों, तब उपयोग करें , यदि आप नए सेट का निर्माण कर रहे हैं, तो इस url.Valuesतरह की संरचना का उपयोग करें

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/url"
    "os"
)

func main() {
    req, err := http.NewRequest("GET","http://api.themoviedb.org/3/tv/popular", nil)
    if err != nil {
        log.Print(err)
        os.Exit(1)
    }

    // if you appending to existing query this works fine 
    q := req.URL.Query()
    q.Add("api_key", "key_from_environment_or_flag")
    q.Add("another_thing", "foo & bar")

    // or you can create new url.Values struct and encode that like so
    q := url.Values{}
    q.Add("api_key", "key_from_environment_or_flag")
    q.Add("another_thing", "foo & bar")

    req.URL.RawQuery = q.Encode()

    fmt.Println(req.URL.String())
    // Output:
    // http://api.themoviedb.org/3/tv/popularanother_thing=foo+%26+bar&api_key=key_from_environment_or_flag
}

11

NewRequestकेवल URL बनाने के लिए उपयोग करना ओवरकिल है। net/urlपैकेज का उपयोग करें :

package main

import (
    "fmt"
    "net/url"
)

func main() {
    base, err := url.Parse("http://www.example.com")
    if err != nil {
        return
    }

    // Path params
    base.Path += "this will get automatically encoded"

    // Query params
    params := url.Values{}
    params.Add("q", "this will get encoded as well")
    base.RawQuery = params.Encode() 

    fmt.Printf("Encoded URL is %q\n", base.String())
}

खेल का मैदान: https://play.golang.org/p/YCTvdluws-r


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