回答

收藏

执行 GET 请求并构建查询字符串

技术问答 技术问答 275 人阅读 | 0 人回复 | 2023-09-12

我对 Go 还是很奇怪,对所有内容都不太了解。 在许多现代语言中Node.js、Angular、jQuery、PHP 中,您可以使用额外的查询字符串参数来执行 GET 请求。/ Q% @' \2 q, f( G6 X. u% N9 j
在 Go 执行这个操作并不像看起来那么简单,我还不能真正理解它。我真的不想连接我想做的每个请求的字符串。
* ^- x3 i9 V# ~9 }7 A; G以示例脚本为例:
; X7 b/ `% H8 M
    package mainimport  "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$ h  e; m& U( T. W0 Q
在这个例子中,你可以看到 URL,它需要 api_key 的 GET 变量,把你的 api 密钥作为值。问题是,这已成为以下形式的硬编码:/ o- M  [- y& E
    req,_ := http.NewRequest("GET","http://api.themoviedb.org/3/tv/popular?api_key=mySuperAwesomeApiKey",nil), i  \1 l9 w) `" N* v
有没有办法动态构建这个查询字符串?目前,我需要在此步骤之前组合 URL 获得有效响应。
/ C6 L2 Q5 B+ ^3 F# x6 s# V                                                               
! ?; J9 ~$ Z$ y% P    解决方案:                                                               
' z$ `# @. P- M) W& R5 X0 w                                                                作为评论员,你可以提到你Values从net/url它有一个Encode方法。你可以做这样的事情(req.URL.Query()返回现有url.Values)
. f- E# z' `7 [: c( W
    package mainimport  "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 & bar&api_key=key_from_environment_or_flag}
    7 \$ A! a$ x( i0 E- b3 p
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则