Maison > développement back-end > Golang > Comment puis-je envoyer une requête POST avec Content-Type: multipart/form-data dans Go, tout en incluant à la fois les paramètres []byte et les arguments de chaîne, étant donné que mes tentatives précédentes ont abouti à un 301 Moved Pe

Comment puis-je envoyer une requête POST avec Content-Type: multipart/form-data dans Go, tout en incluant à la fois les paramètres []byte et les arguments de chaîne, étant donné que mes tentatives précédentes ont abouti à un 301 Moved Pe

Mary-Kate Olsen
Libérer: 2024-10-27 06:51:02
original
399 Les gens l'ont consulté

How can I send a POST request with Content-Type: multipart/form-data in Go, while including both []byte parameters and string arguments, given that my previous attempts have resulted in a 301 Moved Permanently error?

Puis-je publier avec Content-Type : multipart/form-data ?

Question :

Comment puis-je envoyer une requête POST avec Content-Type: multipart/form-data tout en incluant à la fois les paramètres []byte et les arguments de chaîne ? Les tentatives précédentes ont abouti à l'erreur suivante :

[301 301 Moved Permanently]<...HTML response body...>
Copier après la connexion

Code Go fourni :

<code class="go">func NewPost2(url string) ([]byte, error) {
    m := make(map[string]interface{}, 0)
    m["fileName"] ="good"
    m["name"] = Base64ToByte("/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDHooor+wD+Zz//2Q==")
    b, _ := json.Marshal(m)

    httpReq, err := http.NewRequest("POST", url, bytes.NewBuffer(b))
    httpReq.Header.Set("Content-Type", "multipart/form-data;charset=UTF-8")

    client := &amp;http.Client{}
    resp, err := client.Do(httpReq)
    if err != nil {
        return nil, err
    }

    defer resp.Body.Close()

    if resp.StatusCode < 200 || resp.StatusCode >= 300 {
        b, _ := ioutil.ReadAll(resp.Body)
        return nil, fmt.Errorf("[%d %s]%s", resp.StatusCode, resp.Status, string(b))
    }

    respData, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, err
    }

    return respData, nil
}</code>
Copier après la connexion

Réponse :

Le code fourni a tenté d'envoyer des paramètres []byte au format JSON dans le corps de la requête, ce qui n'est pas un format approprié pour les soumissions multipart/form-data.

Pour corriger ce problème, nous pouvons utiliser multipart/form-data. encodage des données avec le code mis à jour suivant :

<code class="go">func NewPostFile(url string, paramTexts map[string]interface{}, paramFile FileItem) ([]byte, error) {
// if paramFiles ==nil {
//  return NewPost(url,paramTexts,header,transport)
// }

// Create a new multipart writer
bodyBuf := &amp;bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)

// Write text parameters to the multipart writer
for k, v := range paramTexts {
    bodyWriter.WriteField(k, v.(string))
}

// Write the file content to the multipart writer
fileWriter, err := bodyWriter.CreateFormFile(paramFile.Key, paramFile.FileName)
if err != nil {
    fmt.Println(err)
    //fmt.Println("Create form file error: ", error)
    return nil, err
}
fileWriter.Write(paramFile.Content)

// Close the multipart writer
bodyWriter.Close()

// Set the Content-Type header to multipart/form-data
contentType := bodyWriter.FormDataContentType()

// Create the POST request with the multipart/form-data body
resp, err := http.Post(url, contentType, bodyBuf)
if err != nil {
    return nil, err
}

// Handle and process the HTTP response
// ... (remainder of code omitted for brevity)</code>
Copier après la connexion

En utilisant l'encodage multipart/form-data et en gérant correctement les paramètres du fichier, nous pouvons désormais réussir le POST avec []paramètres d'octet et arguments de chaîne.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal