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
application/x-www-form-urlencoded
application/x-www-form-urlencoded
一般的なフィールドに使用されるフォームデータは、リクエストボディの中にあり、データは.NET Frameworkに準拠したフォーマットでサーバーに送信されます。マルチパート/フォームデータ
ファイルやバイナリデータに使用される場合、データは特定のフォーマットに従います。そのフォーマットがどのようなものか正確に知りたい場合は、MDNをご覧ください。
テキスト/プレーン
この値は確実に解析されないので、絶対に使用しないでください。
クライアントは、最も運用しやすい方法でリクエストを送信します。
ステップ
パッケージングパラメータ
リクエストの生成
クライアントの生成
client.Do
リクエストの返り値の解析
コード例
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
}