In der Webentwicklung ist es häufig notwendig, HTTP-Anfragen zur Übermittlung von Daten zu verwenden. In einigen Fällen müssen wir möglicherweise den angeforderten Inhaltstyp auf „multipart/form-data“ festlegen und auf der Clientseite Daten mit dem Inhaltstyp „text/plain“ abrufen. Solche Einstellungen können in den Headern des HTTP-Servers konfiguriert werden. In PHP können wir dieses Ziel durch entsprechende Funktionen und Methoden erreichen. In diesem Artikel stellt Ihnen der PHP-Editor Xigua vor, wie Sie den Header-Inhaltstyp des HTTP-Servers in PHP auf „multipart/form-data“ festlegen und die Daten mit dem Content-Type „text/plain“ auf dem Client abrufen.
Der Go-Server setzt den Header-Inhaltstyp auf „Multipart/Formulardaten“
router.HandleFunc("/certificates", serveFilesHandler).Methods("GET") func serveFilesHandler(w http.ResponseWriter, r *http.Request) { currentDir, err := os.Getwd() if err != nil { log.Fatal("Can not find the current directory: ", err) } pathToCertifs := "../certificates" // Create a multipart writer for the response multipartWriter := multipart.NewWriter(w) files := []string{"client.key", "server.key", "rootCA.key"} for _, filename := range files { filePath := filepath.Join(currentDir, pathToCertifs, filename) fmt.Println("see the filePath: ", filePath) // Open the file file, err := os.Open(filePath) if err != nil {} defer file.Close() // Create a new form file part part, err := multipartWriter.CreateFormFile("files", filename) if err != nil {} // Copy the file content to the part _, err = io.Copy(part, file) if err != nil {} } // Set the content type for the response w.Header().Set("Content-Type", multipartWriter.FormDataContentType()) fmt.Println("Content-Type set to:", w.Header().Get("Content-Type")) // printout Content-Type set to: multipart/form-data; boundary=7b326 // Close the multipart writer multipartWriter.Close() }
Aber auf der Kundenseite bekomme ich
Expected multipart response, but received: text/plain; charset=utf-8
Aber die Nutzlast liegt im Körper
body, err := ioutil.ReadAll(resp.Body) if err != nil {} Content-Type: text/plain; charset=utf-8 Response Body: --aee406774ba6a054d52e39a3cdb72f42d32bd30828adbfb1982d278cab56 Content-Disposition: form-data; name="files"; filename="client.key" Content-Type: application/octet-stream -----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDNg4ZaTLC/GdLK xzFDIyPlYyKs/hUXpPkZAQk+3gnvmBaDuMNq2jd2nQoQohmk1zIuD8oj9se5L+3P
Aber ich kann es nicht nach Teilen abrufen, da der Inhaltstyp nicht multipart/form-data ist, also funktioniert das nicht
multipartReader := multipart.NewReader(resp.Body, boundaryFromContentType(contentType)) // Read each part for { part, err := multipartReader.NextPart() if err != nil { break } defer part.Close() ......
Was habe ich übersehen, danke?
ps: Diese Frage brauchte mehr Details, ich hatte das Gefühl, dass sie klar genug war, also habe ich diese Zeile hinzugefügt, es könnte später funktionieren.
HTTP-Antwortheader müssen festgelegt werden, bevor etwas in den Antworttext geschrieben wird. Sobald die Header übermittelt wurden (wenn Sie in den Antworttext schreiben), können Sie die Header nicht mehr festlegen oder ändern.
Sie erstellen den Multipart Writer und alle Teile und Inhalte, legen dann die Antwortheader fest und schließen dann einfach den Multipart Writer. Das Schließen dient nur dazu, die mehrteilige Nachricht zu vervollständigen und die Endgrenze zu schreiben, aber ein Großteil ihres Inhalts wurde möglicherweise bereits geschrieben und festgeschrieben.
Verschieben Sie den Einstellungsheader, bevor Sie etwas zum Multipart Writer hinzufügen/schreiben:
// Create a multipart writer for the response multipartWriter := multipart.NewWriter(w) w.Header().Set("Content-Type", multipartWriter.FormDataContentType()) // Now proceed to add files...
Das obige ist der detaillierte Inhalt vonDer Inhaltstyp des HTTP-Server-Headers ist auf „multipart/form-data' eingestellt, aber auf der Clientseite wird der Inhaltstyp „Text/Plain' abgerufen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!