GETリクエストの送信処理方法
【開発環境】
OS:Win11(64ビット)
go version go1.19.4 windows/amd64
VSCode1.72.2、及びコマンドプロンプト
【HTTPクライアント処理の実装方法】
HTTPクライアントの実装には、サーバの実装と同様にnet/httpを使用できます。
HTTPリクエストの送信方法は、GET/POSTともに、大きく以下の2通りの方法に分けられます。
・方法
1.net/httpパッケージに定義されている関数を使用する方法
2.net/httpパッケージに定義されているClient構造体に実装されたメソッドを使用する方法
・http.Client構造体の定義
type Client struct {
Transport RoundTripper
CheckRedirect func(req *Request, via []*Request) error
Jar CookieJar
Timeout time.Duration
}
Transportプロパティは
名前の通りHTTPトランスポートであり、ローレベルのHTTP通信の実態を表します。
file://プロトコルを表すhttp.fileTransportや、oauth2認証を扱うoauth2.Transportなどが指定する。nilの場合は、http.DefaultTransportとなる。
CheckRedirectプロパティは
リダイレクトを処理するためのポリシーを指定し、引数にreqとviaを持つ関数である。
nil以外の場合は、クライアントはHTTPリダイレクトをたどる前にこの関数を実行
Jarプロパティは
クッキージャーを指定します。Jarは送信リクエストにクッキーを挿入するために使用され、レスポンスのクッキー値で更新されます。
Timeoutプロパティは
このクライアントによるリクエストの制限時間を指定します。
タイムアウトがゼロの場合は、タイムアウトしないことを意味します。
【GETリクエストの送信】
もっとも簡単なGETリクエストの送信方法は、http.Get関数
・定義
func Get(url string) (resp *Response, err error)
http.Get関数は、引数で指定されたURLにGETを発行します。
リダイレクトが多すぎる場合、またはHTTPプロトコルエラーが発生した場合はエラーが返されます。
サンプルコード「server.go」
package main
import (
"io"
"net/http"
)
func hogeHandler(w http.ResponseWriter, req *http.Request) {
// HTMLテキストをhttp.ResponseWriterへ書き込む
io.WriteString(w, `
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Go | net/httpパッケージ</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>これはnet/httpで実装したlocalhostのWEBサーバです</p>
</body>
</html>
`)
}
func main() {
// localhostへのリクエストをhogeHandler関数で処理する
http.HandleFunc("/", hogeHandler)
// localhost:8080でサーバー処理開始
http.ListenAndServe(":8080", nil)
}
次に、クライアント側のコードを以下のように記述
・サンプルコード「client.go」
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
func main() {
// URLを生成
u := &url.URL{}
u.Scheme = "http"
u.Host = "localhost:8080"
// url文字列
uStr := u.String()
// GETリクエスト発行
rsp, err := http.Get(uStr)
if err != nil {
fmt.Println(err)
return
}
// 関数を抜ける際に必ずresponseをcloseするようにdeferでcloseを呼ぶ
defer rsp.Body.Close()
// レスポンスを取得し出力
body, _ := ioutil.ReadAll(rsp.Body)
fmt.Println(string(body))
}
結果
PS D:\GO言語\サンプルプログラム\http-Client\server> go run server.goを実行して、
サーバを起動させる
次に、client.goを実行すると

◆Client構造体のGetメソッドを使用する
Client.Getの定義は以下の通り
Client構造体にはもう一つ、Getメソッドを送信するためのDoメソッドが実装されています。
・定義
func (c *Client) Do(req *Request) (*Response, error)
・サンプルコード「Client2.go」
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/http/httputil"
"net/url"
"time"
)
func main() {
// URLを生成
u := &url.URL{}
u.Scheme = "http"
u.Host = "localhost:8080"
// url文字列
uStr := u.String()
// タイムアウトを30秒に指定してClient構造体を生成
cli := &http.Client{Timeout: time.Duration(30) * time.Second}
// 生成したURLを元にRequest構造体を生成
req, _ := http.NewRequest("GET", uStr, nil)
// リクエストヘッダの内容を出力
header1, _ := httputil.DumpRequestOut(req, true)
fmt.Println(string(header1))
// リクエストにヘッダ情報のを追加(User-Agent)
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; MAFSJS; rv:11.0) like Gecko")
// リクエストヘッダの内容を出力
header2, _ := httputil.DumpRequestOut(req, true)
fmt.Println(string(header2))
// GETリクエスト発行
rsp, err := cli.Do(req)
if err != nil {
fmt.Println(err)
return
}
// 関数を抜ける際に必ずresponseをcloseするようにdeferでcloseを呼ぶ
defer rsp.Body.Close()
// レスポンスを取得し出力
body, _ := ioutil.ReadAll(rsp.Body)
fmt.Println(string(body))
}
実行結果

※コメント投稿者のブログIDはブログ作成者のみに通知されます