Multipart/Form-Data POSTs
Multipart/Form-Data POSTs嘗試使用multipart/form-data POST 資料時,可能會出現類似所提供的錯誤訊息遭遇。理解問題需要檢視問題的構成。遇到的錯誤是 301 Moved Permanently 回應,表示資源已永久重新導向。當未為 multipart/form-data 請求設定正確的 Content-Type 標頭時,通常會發生這種情況。
要解決此問題,請確保將Content-Type 標頭明確設定為「multipart/form-data;」發出POST 請求時,charset=UTF-8」。此標頭通知伺服器此要求包含根據multipart/form-data 協定格式化的基於文字和二進位資料。進口(
"位元組"
“FMMT”
“io”
“io/ioutil”
“啞劇/多部分”
“網路/http”
)
func NewPostWithMultipartFormData(url string, paramTexts map[string]string, paramFiles []FileItem) ([]byte, error) {
// 初始化緩衝區以寫入多部分錶單資料。
buf := new(位元組.Buffer)
// 建立一個新的多部分編寫器。
w := multipart.NewWriter(buf)
// 將文字參數加入到多部分錶單中。
對於鍵,值:=範圍paramTexts {
字段, err := w.CreateFormField(key)
如果錯誤! = nil {
return nil, fmt.Errorf("建立表單欄位'%s'時發生錯誤: %v", key, err)
}
if _, err := field.Write([]byte(value));錯誤! =零{
return nil, fmt.Errorf("將值寫入表單欄位 '%s' 時發生錯誤: %v", key, err)
}
}
// 將二進位參數新增至多部分錶單。
對於_,檔案:=範圍paramFiles {
fileWriter, err := w.CreateFormFile(file.Key, file.FileName)
如果錯誤! = nil {
return nil, fmt.Errorf("建立表單檔案'%s'時發生錯誤: %v", file.Key, err)
}
if _, err := fileWriter.Write(file.Content);錯誤! =零{
return nil, fmt.Errorf("將內容寫入表單檔案'%s'時發生錯誤: %v", file.Key, err)
}
}
// 關閉多部分編寫器。
if err := w.Close();錯誤! =零{
return nil, fmt.Errorf("關閉多部分編寫器時發生錯誤:%v", err)
}
內容類型 := w.FormDataContentType()
// 使用正確的 Content-Type 標頭建立一個新的 POST 請求。
req, err := http.NewRequest(http.MethodPost, url, buf)
如果錯誤! = nil {
return nil, fmt.Errorf("建立 HTTP 請求時發生錯誤:%v", err)
}
req.Header.Set("內容類型", contentType)
// 執行 HTTP 請求。
客戶端 := http.Client{}
resp, err := client.Do(req)
如果錯誤! = nil {
return nil, fmt.Errorf("發送 HTTP 請求時發生錯誤:%v", err)
}
延遲 resp.Body.Close()
// 讀取回應正文。
body, err := ioutil.ReadAll(resp.Body)
如果錯誤! = nil {
return nil, fmt.Errorf("讀取 HTTP 回應正文時發生錯誤: %v", err)
}
返回主體,無
}
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3