proyectos ejemplos http go

http - ejemplos - Ir haciendo una solicitud GET y construyendo el Querystring



django (2)

Como mencionó un comentarista, puede obtener Values de net/url que tiene un método de Encode . Podrías hacer algo como esto ( req.URL.Query() devuelve el url.Values existente)

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

Soy bastante nuevo en Go y todavía no entiendo muy bien todo. En muchos de los lenguajes modernos Node.js, Angular, jQuery, PHP puede hacer una solicitud GET con parámetros de cadena de consulta adicionales.

Hacer esto en Go no es tan simple como parece, y todavía no puedo entenderlo. Realmente no quiero tener que concatenar una cadena para cada una de las solicitudes que quiero hacer.

Aquí está el script de muestra:

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

En este ejemplo, puede ver que hay una URL, que requiere una variable GET de api_key con su clave api como valor. El problema es que esto se convierte en un código duro en forma de:

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

¿Hay una manera de construir esta cadena de consulta dinámicamente? En este momento necesitaré ensamblar la URL antes de este paso para obtener una respuesta válida.


Use r.URL.Query() cuando r.URL.Query() a una consulta existente, si está creando un nuevo conjunto de parámetros, use la estructura url.Values como tal

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 }