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 协议格式化的基于文本和二进制数据。
下面是正确的 Go 代码,成功设置了正确的 Content-Type 标头:
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
)
func NewPostWithMultipartFormData(url string, paramTexts map[string]string, paramFiles []FileItem) ([]byte, error) {
// Initialize a buffer to write the multipart form data.
buf := new(bytes.Buffer)
// Create a new multipart writer.
w := multipart.NewWriter(buf)
// Add text parameters to the multipart form.
for key, value := range paramTexts {
field, err := w.CreateFormField(key)
if err != nil {
return nil, fmt.Errorf("error creating form field '%s': %v", key, err)
}
if _, err := field.Write([]byte(value)); err != nil {
return nil, fmt.Errorf("error writing value to form field '%s': %v", key, err)
}
}
// Add binary parameters to the multipart form.
for _, file := range paramFiles {
fileWriter, err := w.CreateFormFile(file.Key, file.FileName)
if err != nil {
return nil, fmt.Errorf("error creating form file '%s': %v", file.Key, err)
}
if _, err := fileWriter.Write(file.Content); err != nil {
return nil, fmt.Errorf("error writing content to form file '%s': %v", file.Key, err)
}
}
// Close the multipart writer.
if err := w.Close(); err != nil {
return nil, fmt.Errorf("error closing multipart writer: %v", err)
}
contentType := w.FormDataContentType()
// Create a new POST request with the correct Content-Type header.
req, err := http.NewRequest(http.MethodPost, url, buf)
if err != nil {
return nil, fmt.Errorf("error creating HTTP request: %v", err)
}
req.Header.Set("Content-Type", contentType)
// Perform the HTTP request.
client := http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, fmt.Errorf("error sending HTTP request: %v", err)
}
defer resp.Body.Close()
// Read the response body.
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("error reading HTTP response body: %v", err)
}
return body, nil
}
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3