」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼在使用 Multipart/Form-Data POST 請求時會收到 301 Moved Permanently 錯誤?

為什麼在使用 Multipart/Form-Data POST 請求時會收到 301 Moved Permanently 錯誤?

發佈於2024-11-05
瀏覽:437

Why am I getting a 301 Moved Permanently Error when using Multipart/Form-Data POST requests?

Multipart/Form-Data POSTs

Multipart/Form-Data POSTs

嘗試使用multipart/form-data POST 資料時,可能會出現類似所提供的錯誤訊息遭遇。理解問題需要檢視問題的構成。遇到的錯誤是 301 Moved Permanently 回應,表示資源已永久重新導向。當未為 multipart/form-data 請求設定正確的 Content-Type 標頭時,通常會發生這種情況。

要解決此問題,請確保將Content-Type 標頭明確設定為「multipart/form-data;」發出POST 請求時,charset=UTF-8」。此標頭通知伺服器此要求包含根據multipart/form-data 協定格式化的基於文字和二進位資料。進口(
    "位元組"
    “FMMT”
    “io”
    “io/ioutil”
    “啞劇/多部分”
    “網路/http”
)

func NewPostWithMultipartFormData(url string, paramTexts map[string]string, paramFiles []FileItem) ([]byte, error) {
    // 初始化緩衝區以寫入多部分錶單資料。
    buf := new(位元組.Buffer)
    // 建立一個新的多部分編寫器。
    w := multipart.NewWriter(buf)

    // 將文字參數加入到多部分錶單中。
    對於鍵,值:=範圍paramTexts {
        字段, err := w.CreateFormField(key)
        如果錯誤! = nil {
            return nil, fmt.Errorf("建立表單欄位'%s'時發生錯誤: %v", key, err)
        }
        if _, err := field.Write([]byte(value));錯誤! =零{
            return nil, fmt.Errorf("將值寫入表單欄位 '%s' 時發生錯誤: %v", key, err)
        }
    }

    // 將二進位參數新增至多部分錶單。
    對於_,檔案:=範圍paramFiles {
        fileWriter, err := w.CreateFormFile(file.Key, file.FileName)
        如果錯誤! = nil {
            return nil, fmt.Errorf("建立表單檔案'%s'時發生錯誤: %v", file.Key, err)
        }
        if _, err := fileWriter.Write(file.Content);錯誤! =零{
            return nil, fmt.Errorf("將內容寫入表單檔案'%s'時發生錯誤: %v", file.Key, err)
        }
    }

    // 關閉多部分編寫器。
    if err := w.Close();錯誤! =零{
        return nil, fmt.Errorf("關閉多部分編寫器時發生錯誤:%v", err)
    }

    內容類型 := w.FormDataContentType()

    // 使用正確的 Content-Type 標頭建立一個新的 POST 請求。
    req, err := http.NewRequest(http.MethodPost, url, buf)
    如果錯誤! = nil {
        return nil, fmt.Errorf("建立 HTTP 請求時發生錯誤:%v", err)
    }
    req.Header.Set("內容類型", contentType)

    // 執行 HTTP 請求。
    客戶端 := http.Client{}
    resp, err := client.Do(req)
    如果錯誤! = nil {
        return nil, fmt.Errorf("發送 HTTP 請求時發生錯誤:%v", err)
    }
    延遲 resp.Body.Close()

    // 讀取回應正文。
    body, err := ioutil.ReadAll(resp.Body)
    如果錯誤! = nil {
        return nil, fmt.Errorf("讀取 HTTP 回應正文時發生錯誤: %v", err)
    }

    返回主體,無
}
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3