2015-06-04 14 views
24

Sono abbastanza nuovo da fare e non capisco ancora tutto. In molti dei linguaggi moderni Node.js, Angular, jQuery, PHP è possibile eseguire una richiesta GET con parametri di stringa di query aggiuntivi.Vai a fare una richiesta GET e costruire la Querystring

Fare questo in Go non è abbastanza semplice come sembra, e non riesco ancora a capirlo. Davvero non voglio dover concatenare una stringa per ognuna delle richieste che voglio fare.

Ecco lo script di esempio:

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)) 
} 

In questo esempio si può vedere c'è un URL, che richiede una variabile GET di api_key con la vostra chiave API come valore. Il problema è che questo diventa difficile codificato sotto forma di:

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

C'è un modo per costruire questa stringa di query in modo dinamico ?? Al momento dovrò assemblare l'URL prima di questo passaggio per ottenere una risposta valida.

+1

Allora, cosa c'è di sbagliato con concatenando una stringa? –

+3

Suppongo che non sia niente, ma non è davvero una sottigliezza elegante, ho pensato che c'è un modo migliore di fare le cose in Go. Vedete le modifiche all'azione, il metodo e quindi dovete mettere insieme tutto. –

+1

Puoi usare ['url.Values'] (https://golang.org/pkg/net/url/#Values) 's [' Encode'] (https://golang.org/pkg/net/url /#Values.Encode) metodo. Puoi anche utilizzare ['URL.String'] (https://golang.org/pkg/net/url/#URL.String) per creare l'intero URL. –

risposta

86

Come commentatore menzionato è possibile ottenere Values da net/url che ha un metodo Encode. Si potrebbe fare qualcosa di simile (req.URL.Query() restituisce l'attuale 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

+0

Impressionante grazie, amico! Questo è esattamente quello che stavo cercando! –

+0

Ottimo anche per i test! –

+1

Apprezzato, grazie. – djsd123

Problemi correlati