POST de datos de formulario/multipartes
Al intentar publicar datos utilizando datos de formulario/multipartes, se pueden mostrar mensajes de error como el proporcionado. encontrado. Comprender la cuestión requiere examinar su composición. El error encontrado es una respuesta 301 Movido permanentemente, que indica que el recurso ha sido redirigido permanentemente. Esto ocurre a menudo cuando el encabezado Content-Type correcto no está configurado para solicitudes multipart/form-data.
Para resolver este problema, asegúrese de que el encabezado Content-Type esté configurado explícitamente en "multipart/form-data; charset=UTF-8" al realizar la solicitud POST. Este encabezado informa al servidor que la solicitud incluye datos binarios y basados en texto formateados según el protocolo multiparte/datos de formulario.
A continuación se muestra un código Go corregido que establece correctamente el encabezado de tipo de contenido correcto:
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
}
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3