POSTリクエストの送信方法
【開発環境】
OS:Win11(64ビット)
go version go1.19.4 windows/amd64
VSCode1.72.2、及びコマンドプロンプト
◆POSTリクエストの送信
POSTもGETと同じく、http.Client構造体に実装されたメソッドによってリクエストを送信できます。また、
net/httpパッケージによるPOSTリクエストには、大きく5つの方法がある
1.【http.Post関数を使用する】
定義
func Post(url, contentType string, body io.Reader) (resp *Response, err error)
http.Post関数は、引数で指定されたURLにPOSTを発行します。
この際、POSTするデータをio.Reader型で引数に渡す必要があります。
また、呼び出し元で読み取りが終わったら、レスポンスボディを閉じる必要があります
サンプルサーバーは、GERリクエストの送信のものを使う
・クライアント側のコード「client.go」
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
func main() {
// URLを生成
u := &url.URL{}
u.Scheme = "http"
u.Host = "localhost:8080"
// url文字列
uStr := u.String()
// ポストデータ
values := url.Values{}
values.Add("q1", "hoge")
values.Add("q2", "fuga")
// POSTリクエスト発行
rsp, err := http.Post(uStr, "application/x-www-form-urlencoded", strings.NewReader(values.Encode()))
if err != nil {
fmt.Println(err)
return
}
// 関数を抜ける際に必ずresponseをcloseするようにdeferでcloseを呼ぶ
defer rsp.Body.Close()
// レスポンスを取得し出力
body, _ := ioutil.ReadAll(rsp.Body)
fmt.Println(string(body))
}
・実行結果

2,Client構造体のPostFormメソッドを使用する
PostFormメソッドClient構造体に実装されています。
・定義
func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error)
・サンプルコード
「client.go」の下記のところを変更する。
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
// "strings"を削除する
)
func main() {
// URLを生成
u := &url.URL{}
u.Scheme = "http"
u.Host = "localhost:8080"
// url文字列
uStr := u.String()
// ポストデータ
values := url.Values{}
values.Add("q1", "hoge")
values.Add("q2", "fuga")
// POSTリクエスト発行
//rsp, err := http.Post(uStr, "application/x-www-form-urlencoded", strings.NewReader(values.Encode()))
// 変更後
rsp, err := http.PostForm(uStr, values)
if err != nil {
fmt.Println(err)
return
}
// 関数を抜ける際に必ずresponseをcloseするようにdeferでcloseを呼ぶ
defer rsp.Body.Close()
// レスポンスを取得し出力
body, _ := ioutil.ReadAll(rsp.Body)
fmt.Println(string(body))
}
・実行結果は同じ
3、Client構造体のDoメソッドを使用する
定義
func (c *Client) Do(req *Request) (*Response, error)
サンプルコード「do.go」
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/http/httputil"
"net/url"
"strings"
"time"
)
func main() {
// URLを生成
u := &url.URL{}
u.Scheme = "http"
u.Host = "localhost:8080"
// url文字列
uStr := u.String()
// ポストデータ
values := url.Values{}
values.Add("q1", "hoge")
values.Add("q2", "fuga")
// タイムアウトを30秒に指定してClient構造体を生成
cli := &http.Client{Timeout: time.Duration(30) * time.Second}
// 生成したURLを元にRequest構造体を生成
req, _ := http.NewRequest("POST", uStr, strings.NewReader(values.Encode()))
// リクエストにヘッダ情報を追加
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; MAFSJS; rv:11.0) like Gecko")
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
// リクエストヘッダの内容を出力
header, _ := httputil.DumpRequestOut(req, true)
fmt.Println(string(header))
// POSTリクエスト発行
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))
}
io.Reader型のポストデータを渡しhttp.NewRequestを生成している。
HeaderプロパティのUser-AgentとContent-Typeを書き換えている。
・実行する

User-AgentおよびContent-Typeに、指定した値がセットされていることが確認できる。
※コメント投稿者のブログIDはブログ作成者のみに通知されます