blog

goでhttpリクエストを送る

httpプロトコルの知識構造は次のとおりです:参照してください:あなたにHTTPプロトコルのリクエストとhttpに対処するための応答メッセージ構造の詳細な理解をもたらすための記事は、ほとんどがhttp...

Apr 14, 2020 · 4 min. read
Share this

http

知識構造図は以下の通りです:

詳しくは、HTTPプロトコルを詳しく説明した記事をご覧ください。

リクエストとレスポンスのメッセージ構造

httpを扱う際に、最もhttpプロトコルを学ぶためにメッセージを通して、要求と応答メッセージは、より良いことはできません参照してください、メッセージを見るたびに、それは再教育コースに相当し、次のステップは、メッセージを読み取る方法を学ぶことです。

リクエストメッセージの構造

どちらのメッセージも3つの部分から構成されていますが、3つの部分それぞれに異なる名前が付けられています:

リクエストメッセージ:リクエスト行、リクエストヘッダ、リクエストデータ

応答メッセージ:ステータス行、先頭行、エンティティ

Content-Type

HTTPリクエストを送信するためにgo言語を使用する際に、content-typeが正しく設定されていない、サーバーがパラメータを受信しないので、意図的にこの属性を話すようにします。

クライアントがサーバーにHTTP POSTリクエストを開始するとき、サーバーがデータを解析しやすくするために、送信されるデータのタイプをサーバーに伝える必要があります。もし設定しなければ、サーバはリクエストを処理できないかもしれません。

意味:Content-Type は、エンティティ本体内のオブジェクトのメディアタイプを記述します

一般的なメディアフォーマットの種類を以下に示します:
text/html HTML形式 
text/plain プレーンテキスト形式 
text/xml XML形式 
image/gif gif イメージ形式 
image/jpeg jpgイメージ形式 
image/png pngイメージ形式
フォームから送られる投稿リクエストには3種類の Content-Type があります。

application/x-www-form-urlencoded

multipart/form-data

text/plain

  1. application/x-www-form-urlencoded

    application/x-www-form-urlencoded一般的なフィールドに使用されるフォームデータは、リクエストボディの中にあり、データは.NET Frameworkに準拠したフォーマットでサーバーに送信されます。

  2. マルチパート/フォームデータ

    ファイルやバイナリデータに使用される場合、データは特定のフォーマットに従います。そのフォーマットがどのようなものか正確に知りたい場合は、MDNをご覧ください。

  3. テキスト/プレーン

    この値は確実に解析されないので、絶対に使用しないでください。

クライアントは、最も運用しやすい方法でリクエストを送信します。

ステップ

  1. パッケージングパラメータ

  2. リクエストの生成

  3. クライアントの生成

  4. client.Do

  5. リクエストの返り値の解析

コード例

POSTリクエスト

func main(){
 //	ここで、パラメータがリーダに解析される方法に注意すること。
 v:=make(url.Values,0)
	v["code"] = []string{"lkjshdlfkjghlksjdhflgkjhsdlkg"}
	v["wx_nick"] = []string{"lkjshdlfkjghlksjdhflgkjhsdlkg"}
	v["wx_image"] = []string{"lkjshdlfkjghlksjdhflgkjhsdlkg"}
	s:=v.Encode()
	fmt.Println(s)
	data:=strings.NewReader(s)
 //	リクエストを生成する
 url:=baseURL01+"index"
	request,err:=http.NewRequest(http.MethodPost,url,data)
	if err!=nil{
		fmt.Println("NewRequest error: ",err)
		return
	}
 //	このリクエストヘッダのContent-typeは、ginフレームワークがパラメータを解析する方法とどのように対応しているのだろうか?
	//		application/x-www-form-urlencoded => c.PostForm c.Request.FormValue
	//		multipart/form-data		=>		c.FormFile	c.Request.FormFile
	//		application/json		=>		c.Query		Getリクエストは
	request.Header.Set("Content-type", "application/x-www-form-urlencoded")
 //	リクエストを開始し、返されたデータを解析する。
 client:= &http.Client{}
	res,err:=client.Do(request)
	if err!=nil{
		fmt.Println("client.Do error: ",err)
		return
	}
	defer res.Body.Close()
	da,err:=ioutil.ReadAll(res.Body)
	if err!=nil{
		fmt.Println("ioutil.ReadAll error: ",err)
		return
	}
	fmt.Println(string(da))
}

GETリクエスト

func main(){
 	//	ここではパラメータ処理のみを示す 
 params := url.Values{}
 ur, err := url.Parse("https://...1/index")
	if err != nil {
		return 
	}
 //	ここでは、どのようなデータであるかを示す。
 data:=make(map[string]string,0)
	for key, value := range data {
		params.Set(key, value)
	}
	//	リクエストパスを生成する
	ur.RawQuery = params.Encode()
	urlPath := ur.String()
 コード
}

ところで、Getリクエストのもっと簡単な例を記録しておきましょう:

func GetUrl(url string, data map[string]string) ([]byte) {
	params := u.Values{}
	ur, err := u.Parse(url)
	if err != nil {
		return nil
	}
	for key, value := range data {
		params.Set(key, value)
	}
	//	リクエストパスを生成する
	ur.RawQuery = params.Encode()
	urlPath := ur.String()
	res, _ := http.Get(urlPath)
	defer res.Body.Close()
	//	jsonを置く
	d, err := ioutil.ReadAll(res.Body)
	if err != nil {
		return nil
	}
	return d
}
Read next

Spring Extension-1-カスタム環境変数のバリデーション

言うまでもないことですが、公式のコメントを見て、キーメソッドの場所を特定できるはずです。 ご覧のように、スプリングコンテナの初期化は、コレクションからすべてのキーを取り出し、これらのキーを取得します...

Apr 14, 2020 · 4 min read