どのようにGoでフォーム要求を送信しますか?
3614 ワード
通常は第三者と相互作用して使うのはjsonですが、フォーム方式を使ってデータを提出することが要求されることもありますので、今日はGoでフォーム要求を送信する方法を学びます.
準備工作
まず、POST要求を受信し、受信したフィールド情報を返すテストコードがあります.
urlencodedは主に純粋なテキスト要求に使われます.コードは以下の通りです.
multiiPadは主にファイルアップロードの要求を送るために使われます.コードは以下の通りです.
準備工作
まず、POST要求を受信し、受信したフィールド情報を返すテストコードがあります.
package main
import (
"fmt"
"log"
"net/http"
)
func urlencodedHandler(w http.ResponseWriter, r *http.Request) {
err := r.ParseForm()
if err != nil {
log.Printf("r.ParseForm(): %v", err)
return
}
result := ""
for k, v := range r.Form {
result += fmt.Sprintf("%s:%v
", k, v)
}
fmt.Fprintf(w, result)
}
func multipartHandler(w http.ResponseWriter, r *http.Request) {
err := r.ParseMultipartForm(4 * 1024 * 1024)
if err != nil {
log.Printf("r.ParseForm(): %v", err)
return
}
result := ""
for k, v := range r.MultipartForm.Value {
result += fmt.Sprintf("%s:%v
", k, v)
}
for k, v := range r.MultipartForm.File {
result += fmt.Sprintf("%s:%v
", k, v)
}
fmt.Fprintf(w, result)
}
func main() {
http.HandleFunc("/urlencoded", urlencodedHandler)
http.HandleFunc("/multipart", multipartHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
urlencoded要求を送信します.urlencodedは主に純粋なテキスト要求に使われます.コードは以下の通りです.
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
func main() {
payload := url.Values{}
payload.Set("foo", "a")
payload.Add("foo", "b")
payload.Set("foo2", "c")
req, err := http.NewRequest(http.MethodPost,
"http://localhost:8080/urlencoded",
strings.NewReader(payload.Encode()))
if err != nil {
return
}
req.Header.Add("Content-Type",
"application/x-www-form-urlencoded; param=value")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return
}
defer resp.Body.Close()
data, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(data))
}
go run urlencoded.go出力の結果は以下の通りです.foo2:[c]
foo:[a b]
multipartリクエストを送ります.multiiPadは主にファイルアップロードの要求を送るために使われます.コードは以下の通りです.
package main
import (
"bytes"
"fmt"
"io/ioutil"
"log"
"mime/multipart"
"net/http"
)
func main() {
buf := new(bytes.Buffer)
writer := multipart.NewWriter(buf)
writer.WriteField("foo", "a")
writer.WriteField("foo", "b")
part, err := writer.CreateFormFile("tmp.png", "tmp.png")
if err != nil {
return
}
fileData := []byte("hello,world") //
part.Write(fileData)
if err = writer.Close(); err != nil {
return
}
req, err := http.NewRequest(http.MethodPost,
"http://localhost:8080/multipart",
buf)
if err != nil {
return
}
req.Header.Add("Content-Type", writer.FormDataContentType())
resp, err := http.DefaultClient.Do(req)
if err != nil {
return
}
defer resp.Body.Close()
data, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(data))
}
go run multiiPad.goを実行した結果、foo:[a b]
tmp.png:[0xc420082410]
作者:宋佳洋51 rebook K 8 s課程1.18日から授業が始まります.詳細はWeChatです.17812796384は理解に行きます.