POST-сообщения Multipart/Form-Data
При попытке отправить данные POST с использованием multipart/form-data могут появиться сообщения об ошибках, подобные приведенному. столкнулся. Понимание проблемы требует изучения ее состава. Обнаруженная ошибка представляет собой ответ 301 Moved Permanently, указывающий на то, что ресурс был окончательно перенаправлен. Это часто происходит, когда правильный заголовок Content-Type не установлен для запросов multipart/form-data.
Чтобы решить эту проблему, убедитесь, что для заголовка Content-Type явно установлено значение «multipart/form-data; charset=UTF-8" при выполнении запроса POST. Этот заголовок сообщает серверу, что запрос включает в себя как текстовые, так и двоичные данные, отформатированные в соответствии с протоколом 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