Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich eine POST-Anfrage mit Content-Type: multipart/form-data in Go senden und dabei sowohl []Byte-Parameter als auch String-Argumente einbeziehen, wenn meine vorherigen Versuche zu einem 301 Moved Pe geführt haben?

Wie kann ich eine POST-Anfrage mit Content-Type: multipart/form-data in Go senden und dabei sowohl []Byte-Parameter als auch String-Argumente einbeziehen, wenn meine vorherigen Versuche zu einem 301 Moved Pe geführt haben?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-27 06:51:02203Durchsuche

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?

Kann ich mit Content-Type: multipart/form-data posten?

Frage:

Wie kann ich senden? eine POST-Anfrage mit Content-Type: multipart/form-data unter Einbeziehung sowohl von []Byte-Parametern als auch von String-Argumenten? Frühere Versuche haben zu folgendem Fehler geführt:

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

Bereitgestellter Go-Code:

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

Antwort:

Der bereitgestellte Code hat versucht, []Byte-Parameter als JSON im Anforderungstext zu senden, was kein geeignetes Format für mehrteilige/Formulardatenübermittlungen ist.

Um dieses Problem zu beheben, können wir Multipart/Formulardaten-Übermittlungen verwenden. Datenkodierung mit dem folgenden aktualisierten Code:

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

Durch die Verwendung der Multipart-/Formulardatenkodierung und die korrekte Handhabung der Dateiparameter können wir jetzt erfolgreich POST mit []Byte-Parametern und String-Argumenten durchführen.

Das obige ist der detaillierte Inhalt vonWie kann ich eine POST-Anfrage mit Content-Type: multipart/form-data in Go senden und dabei sowohl []Byte-Parameter als auch String-Argumente einbeziehen, wenn meine vorherigen Versuche zu einem 301 Moved Pe geführt haben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn