私は 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))
}
この例では、API キーを値として持つ api_key の GET 変数を必要とする URL があることがわかります。問題は、これが次の形式でハードコードされることです。
req, _ := http.NewRequest("GET", "http://api.themoviedb.org/3/tv/popular?api_key=mySuperAwesomeApiKey", nil)
このクエリ文字列を動的に構築する方法はありますか? 現時点では、有効な応答を取得するには、この手順の前に URL を組み立てる必要があります。
ベストアンサー1
コメント投稿者が述べたように、メソッド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
}