Maison > développement back-end > Golang > le corps du texte

Comment publier sur une API avec Content-Type : multipart/form-data à l'aide de paramètres []byte et d'arguments de chaîne ?

Barbara Streisand
Libérer: 2024-10-28 04:52:01
original
921 Les gens l'ont consulté

How to Post to an API with Content-Type: multipart/form-data Using []byte Parameters and String Arguments?

Publication sur une API avec Content-Type : multipart/form-data

Lors d'une tentative de POST sur une API nécessitant un type de contenu : multipart/form-data, vous pouvez rencontrer des problèmes si vous utilisez des paramètres []byte et des arguments de chaîne. Le message d'erreur fourni indique un problème de redirection, qui n'est pas lié au problème en question.

La solution réside dans la construction du corps de la requête multipart/form-data à l'aide du package multipart. Voici un exemple :

<code class="go">package main

import (
    "bytes"
    "fmt"
    "io"
    "io/ioutil"
    "mime/multipart"
    "net/http"

    "github.com/ganshane/typeregistry"
)

type FileItem struct {
    Key      string //image_content
    FileName string //test.jpg
    Content  []byte //[]byte
}

func NewPostFile(url string, paramTexts map[string]interface{}, paramFile FileItem) ([]byte, error) {
    // Construct the multipart request body

    bodyBuf := &bytes.Buffer{}
    bodyWriter := multipart.NewWriter(bodyBuf)

    for k, v := range paramTexts {
        bodyWriter.WriteField(k, v.(string))
    }
    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)
    contentType := bodyWriter.FormDataContentType()
    bodyWriter.Close()
    fmt.Println(bodyBuf.String())

    // Perform the POST request

    resp, err := http.Post(url, contentType, bodyBuf)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    fmt.Println(resp)

    // Handle the response

    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
    }
    fmt.Println(string(respData))
    return respData, nil
}

func main() {
    m := make(map[string]interface{}, 0)
    m["fileName"] = "good"
    m["name"] = typeregistry.Base64ToByte("/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDHooor+wD+Zz//2Q==")

    paramFile := FileItem{
        Key:      "image_content",
        FileName: "test.jpg",
        Content:  m["name"].([]byte),
    }

    respData, err := NewPostFile("API_URL", m, paramFile)
    if err != nil {
        // Handle error
    }

    fmt.Println(string(respData))
}
</code>
Copier après la connexion

Dans cet exemple, nous avons utilisé la fonction NewPostFile pour construire une requête POST avec des données multipart/form, comprenant à la fois des champs de formulaire normaux et un fichier. La fonction prend l'URL, une carte d'arguments de chaîne et un élément de fichier en entrée.

La réponse de l'API peut être récupérée à partir de la variable respData et traitée selon les besoins. Le code de gestion des erreurs et des réponses est laissé au développeur à mettre en œuvre en fonction de ses exigences spécifiques.

Cette solution devrait résoudre le problème que vous rencontrez lors du POST sur l'API à l'aide de Content-Type : multipart/form-data. 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!

source:php.cn
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!