2014-11-18 13 views
13

Interesuje mnie dynamiczne przyjmowanie argumentów od użytkownika jako danych wejściowych za pośrednictwem przeglądarki lub interfejsu CLI, które przekazują te parametry do wywołania REST API, a co za tym idzie, dynamiczne budowanie adresu URL za pomocą funkcji Go, która będzie używana ostatecznie przynieś mi trochę danych JSON. Chciałem poznać niektóre techniki w Go, które mogą mi w tym pomóc. Jednym z idealnych pomysłów było użycie mapy i wypełnienie jej kluczami argumentów i odpowiadającymi im wartościami oraz iteracja i dołączenie do ciągu URL. Ale jeśli chodzi o dynamiczne przyjmowanie argumentów i zapełnianie mapy, nie jestem pewien jak to zrobić w Go. Czy ktoś może mi pomóc z fragmentem kodu w Go?Konstruktor URL/Konstruktor zapytań w Go

Przykład -

http: //: port api = fetchJsonData & arg1 = val1 & arg2 = wart2 & arg3 = val3 ..... & argn = valn

Odpowiedz

29

Jest już url.URL który obsługuje tego rodzaju rzeczy dla ciebie.

Dla procedur obsługi protokołu HTTP (żądania przychodzące) jest częścią http.Request (dostęp do niej za pomocą req.URL.Query()).

Bardzo dobrym przykładem z oficjalnej docs:

u, err := url.Parse("http://bing.com/search?q=dotnet") 
if err != nil { 
    log.Fatal(err) 
} 
u.Scheme = "https" 
u.Host = "google.com" 
q := u.Query() 
q.Set("q", "golang") 
u.RawQuery = q.Encode() 
fmt.Println(u) 
+0

Jest to dobry sposób. Dzięki. Czy możesz też zaproponować sposób, w jaki mogę przechowywać parę klucz-wartość na mapie, a następnie użyć tej mapy do utworzenia adresu URL? – psbits

+1

@psbits 'url.Values' jest mapą (możesz pobrać kopię z u.Query()), możesz jej użyć do skonstruowania adresu URL, a następnie użyj' u: = url.Parse ("http: // base. com/"); u.RawQuery = yourValues.Encode(); URL: = u.String() ' – OneOfOne

+0

Cóż, dziękuję. Zrobiłem coś takiego - {urlMap: = zrobić (mapa [ciąg] string) \t urlMap [ "arg1"] = "val1" \t urlMap [ "arg2"] = "wart2" \t url.Scheme = " http” \t url.Host = Ip + ":" + DefaultPort \t P: = url.Query() \t k, _: = zakres urlMap { \t \t q.Set (k urlMap [k]), \t} \t url.RawQuery = q.Encode() \t fmt.Println (URL)} – psbits