2015-06-04 13 views
24

Jestem całkiem nowym użytkownikiem Go i nie do końca rozumiem wszystko. W wielu nowoczesnych językach Node.js, Angular, jQuery, PHP można wykonać żądanie GET z dodatkowymi parametrami ciągu zapytania.Wykonuję żądanie GET i buduję Querystringa

Robienie tego w Go nie jest tak proste, jak się wydaje, i nie mogę tego naprawdę rozgryźć. Naprawdę nie chcę łączyć ciągów dla każdej z żądań, które chcę wykonać.

Oto przykładowy skrypt:

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

W tym przykładzie widać nie jest URL, który wymaga zmiennej GET api_key z klucz API jako wartość. Problem polega na tym, że staje się to trudne w postaci:

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

Czy istnieje sposób na dynamiczne budowanie tego łańcucha zapytania? W tej chwili będę musiał złożyć adres URL przed tym krokiem, aby uzyskać prawidłową odpowiedź.

+1

Więc co jest nie tak z złączenie ciąg? –

+3

Nic nie przypuszczam, ale to naprawdę nie jest eleganckie rozwiązanie, tylko myślę, że jest lepszy sposób robienia rzeczy w Go. Widzisz zmiany akcji, metodę, a następnie musisz wszystko połączyć. –

+1

Możesz użyć ['url.Values'] (https://golang.org/pkg/net/url/#Values) 's [' Encode'] (https://golang.org/pkg/net/url /#Values.Encode) metoda. Możesz również użyć ['URL.String'] (https://golang.org/pkg/net/url/#URL.String), aby zbudować cały URL. –

Odpowiedz

86

Jako komentator wspomniano, można uzyskać Values z net/url, który ma metodę Encode. Można zrobić coś takiego (req.URL.Query() powraca istniejąca 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

Niesamowite dziękuję człowieku! Właśnie tego szukałem! –

+0

Świetny do testowania! –

+1

Doceniona, dziękuję. – djsd123