職案人

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

POSTリクエストの送信

2023年08月21日 | GO言語
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に、指定した値がセットされていることが確認できる。

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

コメントを投稿

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