我对 Go 还很陌生,目前还不太了解所有内容。在许多现代语言 Node.js、Angular、jQuery、PHP 中,您可以使用附加查询字符串参数执行 GET 请求。
在 Go 中执行此操作并不像看起来那么简单,而且我目前还无法真正弄明白。我真的不想为我想做的每个请求连接一个字符串。
这是示例脚本:
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 变量,并将您的 api 密钥作为值。问题是这变成了以下形式的硬编码:
req, _ := http.NewRequest("GET", "http://api.themoviedb.org/3/tv/popular?api_key=mySuperAwesomeApiKey", nil)
有没有办法动态构建这个查询字符串?目前,我需要在此步骤之前组合 URL 以获得有效响应。
作为一个评论者提到你可以Values从net/url它有一个Encode方法。你可以做这样的事情(req.URL.Query()返回现有的url.Values)
Values
net/url
Encode
req.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 }