>백엔드 개발 >Golang >[]byte 매개변수와 문자열 인수를 사용하여 Content-Type: multipart/form-data로 API에 게시하는 방법은 무엇입니까?

[]byte 매개변수와 문자열 인수를 사용하여 Content-Type: multipart/form-data로 API에 게시하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-28 04:52:011004검색

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

Content-Type이 필요한 API에 게시: multipart/form-data

Content-Type이 필요한 API에 POST를 시도하는 경우: multipart/form-data에서 []byte 매개변수와 문자열 인수를 사용하는 경우 문제가 발생할 수 있습니다. 제공된 오류 메시지는 현재 문제와 관련이 없는 리디렉션 문제를 나타냅니다.

해결책은 멀티파트 패키지를 사용하여 멀티파트/양식 데이터 요청 본문을 구성하는 데 있습니다. 예는 다음과 같습니다.

<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, 문자열 인수 맵 및 파일 항목을 입력으로 사용합니다.

API의 응답은 respData 변수에서 검색하여 필요에 따라 처리할 수 있습니다. 오류 처리 및 응답 처리 코드는 개발자가 특정 요구 사항에 따라 구현하도록 남겨져 있습니다.

이 솔루션은 Content-Type: multipart/form-data를 사용하여 API에 게시할 때 발생한 문제를 해결해야 합니다. []바이트 매개변수와 문자열 인수를 사용합니다.

위 내용은 []byte 매개변수와 문자열 인수를 사용하여 Content-Type: multipart/form-data로 API에 게시하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.