>  기사  >  백엔드 개발  >  이전 시도에서 301 Moved Pe가 발생한 경우 []byte 매개변수와 문자열 인수를 모두 포함하면서 Go에서 Content-Type: multipart/form-data를 사용하여 POST 요청을 보내려면 어떻게 해야 합니까?

이전 시도에서 301 Moved Pe가 발생한 경우 []byte 매개변수와 문자열 인수를 모두 포함하면서 Go에서 Content-Type: multipart/form-data를 사용하여 POST 요청을 보내려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-27 06:51:02203검색

How can I send a POST request with Content-Type: multipart/form-data in Go, while including both []byte parameters and string arguments, given that my previous attempts have resulted in a 301 Moved Permanently error?

Content-Type: multipart/form-data로 게시할 수 있나요?

질문:

어떻게 보내나요? []byte 매개변수와 문자열 인수를 모두 포함하면서 Content-Type: multipart/form-data를 사용한 POST 요청이 있습니까? 이전 시도에서 다음 오류가 발생했습니다.

[301 301 Moved Permanently]<...HTML response body...>

제공된 Go 코드:

<code class="go">func NewPost2(url string) ([]byte, error) {
    m := make(map[string]interface{}, 0)
    m["fileName"] ="good"
    m["name"] = Base64ToByte("/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDHooor+wD+Zz//2Q==")
    b, _ := json.Marshal(m)

    httpReq, err := http.NewRequest("POST", url, bytes.NewBuffer(b))
    httpReq.Header.Set("Content-Type", "multipart/form-data;charset=UTF-8")

    client := &amp;http.Client{}
    resp, err := client.Do(httpReq)
    if err != nil {
        return nil, err
    }

    defer resp.Body.Close()

    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
    }

    return respData, nil
}</code>

정답:

제공된 코드는 요청 본문에서 []byte 매개변수를 JSON으로 전송하려고 시도했는데, 이는 멀티파트/양식 데이터 제출에 적합한 형식이 아닙니다.

이 문제를 해결하려면 multipart/form-를 사용할 수 있습니다. 다음 업데이트된 코드를 사용한 데이터 인코딩:

<code class="go">func NewPostFile(url string, paramTexts map[string]interface{}, paramFile FileItem) ([]byte, error) {
// if paramFiles ==nil {
//  return NewPost(url,paramTexts,header,transport)
// }

// Create a new multipart writer
bodyBuf := &amp;bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)

// Write text parameters to the multipart writer
for k, v := range paramTexts {
    bodyWriter.WriteField(k, v.(string))
}

// Write the file content to the multipart writer
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)

// Close the multipart writer
bodyWriter.Close()

// Set the Content-Type header to multipart/form-data
contentType := bodyWriter.FormDataContentType()

// Create the POST request with the multipart/form-data body
resp, err := http.Post(url, contentType, bodyBuf)
if err != nil {
    return nil, err
}

// Handle and process the HTTP response
// ... (remainder of code omitted for brevity)</code>

다중 부분/양식 데이터 인코딩을 사용하고 파일 매개변수를 올바르게 처리함으로써 이제 []바이트 매개변수와 문자열 인수를 사용하여 성공적으로 POST를 수행할 수 있습니다.

위 내용은 이전 시도에서 301 Moved Pe가 발생한 경우 []byte 매개변수와 문자열 인수를 모두 포함하면서 Go에서 Content-Type: multipart/form-data를 사용하여 POST 요청을 보내려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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