net/httpパッケージを利用してGETメソッドによるHTTPリクエストをおこないます。
まずはhttp.Getを利用した必要最低限の実装から。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package main import ( "fmt" "io/ioutil" "log" "net/http" ) func main() { url := "https://jsonplaceholder.typicode.com/todos" response, err := http.Get(url) if err != nil { log.Fatal(err) } defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { log.Fatal(err) } fmt.Println(string(body)) //レスポンスのステータス fmt.Println(string(response.Status)) } |
18行目
リソースリークを防ぐためにレスポンスのボディを閉じる処理を、関数の終了時(上記ではmain)に呼ばれるdeferに設定しています。
20行目
ioutil.ReadAllでレスポンスのボディを読み込み、バイトスライス([]byte型)として取得します。25行目において文字列に変換し出力しています。
関連ページ
curlコマンドを利用する[POST][JSON][COOKIE]
次にhttp.Clientを利用して、リクエストにタイムアウトを5秒に設定してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
package main import ( "fmt" "io/ioutil" "log" "net/http" "time" ) func main() { url := "https://jsonplaceholder.typicode.com/todos" timeout := time.Duration(5 * time.Second) client := &http.Client{ Timeout: timeout, } response, err := client.Get(url) if err != nil { log.Fatal(err) } defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { log.Fatal(err) } fmt.Println(string(body)) } |
下記ではクエリパラメータを組み立ててリクエストしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
package main import ( "fmt" "io/ioutil" "log" "net/http" "time" ) func main() { url := "https://jsonplaceholder.typicode.com/todos" request, err := http.NewRequest("GET", url, nil) if err != nil{ log.Fatal(err) } //クエリパラメータ params := request.URL.Query() params.Add("userId","1") request.URL.RawQuery = params.Encode() fmt.Println(request.URL.String()) //https://jsonplaceholder.typicode.com/todos?userId=1 timeout := time.Duration(5 * time.Second) client := &http.Client{ Timeout: timeout, } response, err := client.Do(request) if err != nil{ log.Fatal(err) } defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { log.Fatal(err) } fmt.Println(string(body)) } |
15行目
http.NewRequestでリクエスト型のオブジェクト(構造体Request)を生成しています。
21〜23行目
構造体RequestにはURL・Header・Body・Form等のフィールドがあります。さらにURLフィールドとしての構造体にはRawQueryフィールドが存在し、最終的に作成したクエリパラメータをして設定しています(23行目)。21行目のQuery()でクエリパラメータとしての型、つまりキーと値を持つmapとしてのオブジェクトを生成しています。
上記コードでは実装していませんが、リクエストヘッダーを細かく指定し送信する場合は、HeaderフィールドのSet()もしくはAdd()を利用してリクエストに設定していきます。
1 |
request.Header.Set("name", "value") |
参照ページ・文献