職案人

求職・歴史・仏教などについて掲載するつもりだが、自分の思いつきが多いブログだよ。適当に付き合って下さい。

GETリクエストの送信処理方法

2023年08月19日 | GO言語
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))
}

実行結果

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« HTTPリクエストハンドラ | トップ | POSTリクエストの送信 »
最新の画像もっと見る

コメントを投稿

GO言語」カテゴリの最新記事