一般咱們與第三方交互使用的是 json,但偶爾也會遇到要求使用表單方式來提交數據,故今天咱們就一塊兒來學習下如何在 Go 中發送表單請求。json
首先咱們有這樣一段測試代碼來接收 POST 請求,並返回其接收到的字段信息。app
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\n", 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\n", k, v) } for k, v := range r.MultipartForm.File { result += fmt.Sprintf("%s:%v\n", k, v) } fmt.Fprintf(w, result) } func main() { http.HandleFunc("/urlencoded", urlencodedHandler) http.HandleFunc("/multipart", multipartHandler) log.Fatal(http.ListenAndServe(":8080", nil)) }
urlencoded 主要用於純文本請求,代碼以下:ide
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 主要用於發送文件上傳的請求,代碼以下:測試
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 multipart.go 輸出結果爲:url
foo:[a b] tmp.png:[0xc420082410]
做者:songjiayang
出處:https://url.cn/5HwFSTbcode
Golang 課程火熱招生資料找WeChat:17812796384orm