Multipart/Form-Data POST
尝试使用 multipart/form-data 发布数据时,可能会出现类似所提供的错误消息遭遇。理解问题需要检查问题的构成。遇到的错误是 301 Moved Permanently 响应,表明资源已被永久重定向。当未为 multipart/form-data 请求设置正确的 Content-Type 标头时,通常会发生这种情况。
要解决此问题,请确保 Content-Type 标头显式设置为“multipart/form-data;”发出 POST 请求时,charset=UTF-8”。此标头通知服务器请求包含根据 multipart/form-data 协议格式化的基于文本和二进制数据。
下面是正确的 Go 代码,成功设置了正确的 Content-Type 标头:
<code class="go">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 }</code>
以上是为什么在使用 Multipart/Form-Data POST 请求时会收到 301 Moved Permanently 错误?的详细内容。更多信息请关注PHP中文网其他相关文章!