"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo publicar en una API con tipo de contenido: multipart/form-data usando []byte parámetros y argumentos de cadena?

¿Cómo publicar en una API con tipo de contenido: multipart/form-data usando []byte parámetros y argumentos de cadena?

Publicado el 2024-11-21
Navegar:570

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

Publicación en una API con tipo de contenido: multipart/form-data

Al intentar PUBLICAR en una API que requiere tipo de contenido: multipart/form-data, puede encontrar problemas si utiliza parámetros de []bytes y argumentos de cadena. El mensaje de error proporcionado indica un problema de redirección, que no está relacionado con el problema en cuestión.

La solución radica en construir el cuerpo de solicitud de datos de formulario/multiparte utilizando el paquete multiparte. Aquí hay un ejemplo:

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 = 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))
}

En este ejemplo, utilizamos la función NewPostFile para construir una solicitud POST con datos de formulario/multiparte, incluidos campos de formulario normales y un archivo. La función toma la URL, un mapa de argumentos de cadena y un elemento de archivo como entrada.

La respuesta de la API se puede recuperar de la variable respData y procesar según sea necesario. El código de manejo de errores y manejo de respuestas queda en manos del desarrollador para implementarlo de acuerdo con sus requisitos específicos.

Esta solución debería solucionar el problema que estaba experimentando al publicar en la API usando el tipo de contenido: multipart/form-data con []parámetros de bytes y argumentos de cadena.

Último tutorial Más>

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