首頁  >  文章  >  後端開發  >  如何使用 []byte 參數和字串參數發佈到內容類型為 multipart/form-data 的 API?

如何使用 []byte 參數和字串參數發佈到內容類型為 multipart/form-data 的 API?

Barbara Streisand
Barbara Streisand原創
2024-10-28 04:52:01922瀏覽

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

發佈到具有Content-Type 的API:multipart/form-data

嘗試POST 到需要Content-Type 的API 時: multipart /form-data,如果您使用[]byte 參數和字串參數,您可能會遇到問題。提供的錯誤訊息表示重定向問題,與當前問題無關。

解決方案在於使用 multipart 套件建立 multipart/form-data 請求正文。以下是一個範例:

<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>

在這個範例中,我們使用 NewPostFile 函數建立一個包含 multipart/form-data 的 POST 請求,包括常規表單欄位和檔案。此函數將 URL、字串參數映射和文件項目作為輸入。

可以從 respData 變數擷取來自 API 的回應並根據需要進行處理。錯誤處理和回應處理程式碼留給開發人員根據他們的特定要求來實現。

此解決方案應該解決您在使用 Content-Type: multipart/form-data POST 到 API 時遇到的問題帶有 [] 位元組參數和字串參數。

以上是如何使用 []byte 參數和字串參數發佈到內容類型為 multipart/form-data 的 API?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn