"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا أحصل على خطأ 301 تم نقله بشكل دائم عند استخدام طلبات POST متعددة الأجزاء/بيانات النموذج؟

لماذا أحصل على خطأ 301 تم نقله بشكل دائم عند استخدام طلبات POST متعددة الأجزاء/بيانات النموذج؟

تم النشر بتاريخ 2024-11-05
تصفح:900

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

منشورات متعددة الأجزاء/بيانات النموذج

عند محاولة نشر البيانات باستخدام بيانات متعددة الأجزاء/النموذج، يمكن أن تظهر رسائل خطأ مثل تلك المقدمة مواجهة. إن فهم المشكلة يتطلب فحص تركيبتها. الخطأ الذي تمت مواجهته هو استجابة 301 تم النقل بشكل دائم، مما يشير إلى أنه تمت إعادة توجيه المورد بشكل دائم. يحدث هذا غالبًا عندما لا يتم تعيين رأس نوع المحتوى الصحيح لطلبات بيانات النموذج/متعددة الأجزاء.

لحل هذه المشكلة، تأكد من تعيين رأس نوع المحتوى بشكل صريح على "بيانات متعددة الأجزاء/النموذج؛ مجموعة الأحرف=UTF-8" عند تقديم طلب POST. يُعلم هذا الرأس الخادم أن الطلب يتضمن كلاً من البيانات النصية والبيانات الثنائية المنسقة وفقًا لبروتوكول بيانات النموذج/متعدد الأجزاء.

يوجد أدناه رمز Go المصحح الذي نجح في تعيين رأس نوع المحتوى الصحيح:

import (
    "bytes"
    "fmt"
    "io"
    "io/ioutil"
    "mime/multipart"
    "net/http"
)

func NewPostWithMultipartFormData(url string, paramTexts map[string]string, paramFiles []FileItem) ([]byte, error) {
    // Initialize a buffer to write the multipart form data.
    buf := new(bytes.Buffer)
    // Create a new multipart writer.
    w := multipart.NewWriter(buf)

    // Add text parameters to the multipart form.
    for key, value := range paramTexts {
        field, err := w.CreateFormField(key)
        if err != nil {
            return nil, fmt.Errorf("error creating form field '%s': %v", key, err)
        }
        if _, err := field.Write([]byte(value)); err != nil {
            return nil, fmt.Errorf("error writing value to form field '%s': %v", key, err)
        }
    }

    // Add binary parameters to the multipart form.
    for _, file := range paramFiles {
        fileWriter, err := w.CreateFormFile(file.Key, file.FileName)
        if err != nil {
            return nil, fmt.Errorf("error creating form file '%s': %v", file.Key, err)
        }
        if _, err := fileWriter.Write(file.Content); err != nil {
            return nil, fmt.Errorf("error writing content to form file '%s': %v", file.Key, err)
        }
    }

    // Close the multipart writer.
    if err := w.Close(); err != nil {
        return nil, fmt.Errorf("error closing multipart writer: %v", err)
    }

    contentType := w.FormDataContentType()

    // Create a new POST request with the correct Content-Type header.
    req, err := http.NewRequest(http.MethodPost, url, buf)
    if err != nil {
        return nil, fmt.Errorf("error creating HTTP request: %v", err)
    }
    req.Header.Set("Content-Type", contentType)

    // Perform the HTTP request.
    client := http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return nil, fmt.Errorf("error sending HTTP request: %v", err)
    }
    defer resp.Body.Close()

    // Read the response body.
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, fmt.Errorf("error reading HTTP response body: %v", err)
    }

    return body, nil
}
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3