如何在 Go 中傳送表單請求
通常我們與第三方互動使用的是 json
格式,但偶爾也會遇到要求使用表單方式來提交資料,故今天我們就一起來學習下如何在 Go 中傳送表單請求。
準備工作
首先我們有這樣一段測試程式碼來接收 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\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 請求
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 請求
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
輸出結果為:
foo:[a b]
tmp.png:[0xc420082410]
更多閱讀,請關注
- 個人部落格: http://www.songjiayang.com/
- 個人微博: https://weibo.com/songjiayang1
- 個人微信公號:
相關文章
- Go HTTP GET 請求可以傳送 body 嗎GoHTTP
- Go使用net/http庫傳送GET請求GoHTTP
- SpringMVC中如何傳送GET請求、POST請求、PUT請求、DELETE請求。SpringMVCdelete
- 如何在 PHP 中傳送 xml 資料作為請求內容PHPXML
- Postman傳送Post請求Postman
- java傳送http請求JavaHTTP
- Java傳送Post請求Java
- 傳送GET請求 示例
- html頁面中如何傳送ajax請求HTML
- 如何傳送請求以及AJAX
- python傳送HTTP POST請求PythonHTTP
- 使用Feign傳送HTTP請求HTTP
- Golang:使用go-resty/resty傳送http請求get和postGolangRESTHTTP
- Vue 使用 Axios 傳送請求的請求體問題VueiOS
- Postman傳送請求引數是Map格式的請求Postman
- Vue中封裝axios傳送請求Vue封裝iOS
- java傳送GET和post請求Java
- linux用curl傳送post請求Linux
- Python爬蟲(二)——傳送請求Python爬蟲
- nodejs使用request傳送http請求NodeJSHTTP
- Jmeter —— jmeter利用取樣器中http傳送請求JMeterHTTP
- 在Java中,使用HttpUtils實現傳送HTTP請求JavaHTTP
- vue中使用axios傳送ajax請求VueiOS
- react-fetch資料傳送請求React
- 首頁 使用axios 傳送ajax請求iOS
- 使用requests庫來傳送HTTP請求HTTP
- httprequest- post- get -傳送請求HTTP
- 使用Postman傳送POST請求的指南Postman
- java傳送get請求帶引數Java
- shell指令碼:批次傳送curl請求指令碼
- file_get_contents傳送post請求
- 以Raw的方式傳送POST請求
- jQuery裡如何使用ajax傳送請求jQuery
- 介面測試如何在post請求中傳遞檔案
- 介面測試如何在 post 請求中傳遞檔案
- 為何要在componentDidMount裡面傳送請求?
- postman(二):使用postman傳送get or post請求Postman
- 什麼時候會傳送options請求