Content-Type을 사용하여 API에 게시: multipart/form-data
Content-Type이 필요한 API에 POST를 시도하는 경우: multipart/form-data에서 []byte 매개변수와 문자열 인수를 사용하는 경우 문제가 발생할 수 있습니다. 제공된 오류 메시지는 현재 문제와 관련이 없는 리디렉션 문제를 나타냅니다.
해결책은 멀티파트 패키지를 사용하여 멀티파트/양식 데이터 요청 본문을 구성하는 데 있습니다. 예는 다음과 같습니다.
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))
}
이 예에서는 NewPostFile 함수를 사용하여 일반 양식 필드와 파일을 모두 포함하는 multipart/form-data로 POST 요청을 구성했습니다. 이 함수는 URL, 문자열 인수 맵 및 파일 항목을 입력으로 사용합니다.
API의 응답은 respData 변수에서 검색하여 필요에 따라 처리할 수 있습니다. 오류 처리 및 응답 처리 코드는 개발자가 특정 요구 사항에 따라 구현하도록 남겨져 있습니다.
이 솔루션은 Content-Type: multipart/form-data를 사용하여 API에 게시할 때 발생한 문제를 해결해야 합니다. []바이트 매개변수와 문자열 인수를 사용합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3