Dies wird wahrscheinlich eine dumme Frage sein, aber ich habe einen dieser Nächte. In einer Anwendung entwickle ich eine RESTful-API und wir möchten, dass der Client Daten als JSON sendet. Ein Teil dieser Anwendung erfordert, dass der Client eine Datei (normalerweise ein Bild) sowie Informationen zum Bild hochlädt.
Es fällt mir schwer, herauszufinden, wie dies in einer einzelnen Anfrage geschieht. Ist es möglich, die Dateidaten in eine JSON-Zeichenfolge zu Base64 umzuwandeln? Muss ich 2 Posts auf dem Server ausführen? Sollte ich dafür nicht JSON verwenden?
Nebenbei bemerkt, wir verwenden Grails im Backend und auf diese Dienste wird von nativen mobilen Clients (iPhone, Android usw.) zugegriffen, wenn dies einen Unterschied macht.
json
rest
grails
file-upload
Gregg
quelle
quelle
Antworten:
Ich habe hier eine ähnliche Frage gestellt:
Wie lade ich eine Datei mit Metadaten über einen REST-Webdienst hoch?
Sie haben grundsätzlich drei Möglichkeiten:
multipart/form-data
POST und geben Sie eine ID an den Client zurück. Der Client sendet dann die Metadaten mit der ID, und der Server ordnet die Datei und die Metadaten erneut zu.quelle
Sie können die Datei und die Daten in einer Anfrage mit dem Inhaltstyp Multipart / Formulardaten senden :
Von http://www.faqs.org/rfcs/rfc2388.html :
Sie können Datei- oder Feldinformationen in jeden Abschnitt zwischen den Grenzen einfügen. Ich habe erfolgreich einen RESTful-Service implementiert, bei dem der Benutzer sowohl Daten als auch ein Formular senden musste, und Multipart- / Formulardaten funktionierten einwandfrei. Der Dienst wurde mit Java / Spring erstellt, und der Client verwendete C #. Daher habe ich leider keine Grails-Beispiele für die Einrichtung des Dienstes. In diesem Fall müssen Sie JSON nicht verwenden, da Sie in jedem Abschnitt "Formulardaten" den Namen des Parameters und seinen Wert angeben können.
Das Gute an der Verwendung von mehrteiligen / Formulardaten ist, dass Sie HTTP-definierte Header verwenden. Sie halten sich also an die REST-Philosophie, vorhandene HTTP-Tools zum Erstellen Ihres Dienstes zu verwenden.
quelle
Ich weiß, dass dieser Thread ziemlich alt ist, aber mir fehlt hier eine Option. Wenn Sie Metadaten (in einem beliebigen Format) haben, die Sie zusammen mit den hochzuladenden Daten senden möchten, können Sie eine einzelne
multipart/related
Anfrage stellen.Weitere Informationen finden Sie in der RFC 2387- Spezifikation.
Grundsätzlich kann jeder Teil einer solchen Anfrage Inhalte mit unterschiedlichem Typ haben und alle Teile sind irgendwie miteinander verbunden (z. B. ein Bild und seine Metadaten). Die Teile sind durch eine Grenzzeichenfolge gekennzeichnet, und auf die endgültige Grenzzeichenfolge folgen zwei Bindestriche.
Beispiel:
quelle
Ich weiß, dass diese Frage alt ist, aber in den letzten Tagen hatte ich das gesamte Web durchsucht, um dieselbe Frage zu lösen. Ich habe Grails REST Webservices und iPhone Client, die Bilder, Titel und Beschreibung senden.
Ich weiß nicht, ob mein Ansatz der beste ist, aber er ist so einfach und unkompliziert.
Ich mache ein Bild mit dem UIImagePickerController und sende die NSData mit den Header-Tags der Anfrage an den Server, um die Daten des Bildes zu senden.
Auf der Serverseite erhalte ich das Foto mit dem folgenden Code:
Ich weiß nicht, ob ich in Zukunft Probleme habe, aber jetzt funktioniert es gut in der Produktionsumgebung.
quelle
Hier ist meine Ansatz-API (ich verwende ein Beispiel) - wie Sie sehen können, verwende ich keine
file_id
(auf den Server hochgeladene Dateikennung) in der API:Erstellen
photo
Objekt auf Server :Datei hochladen (beachten Sie das
file
in Singularform, da es nur eine pro Foto gibt):Und dann zum Beispiel:
Fotoliste lesen
Lesen Sie einige Fotodetails
Fotodatei lesen
Die Schlussfolgerung ist also, dass Sie zuerst ein Objekt (Foto) per POST erstellen und dann eine zweite Anfrage mit der Datei senden (erneut POST).
quelle
FormData-Objekte: Dateien mit Ajax hochladen
XMLHttpRequest Level 2 bietet Unterstützung für die neue FormData-Schnittstelle. FormData-Objekte bieten eine Möglichkeit, auf einfache Weise eine Reihe von Schlüssel / Wert-Paaren zu erstellen, die Formularfelder und deren Werte darstellen. Diese können dann einfach mit der XMLHttpRequest-Methode send () gesendet werden.
https://developer.mozilla.org/en-US/docs/Web/API/FormData
quelle
Da das einzige fehlende Beispiel das ANDROID-Beispiel ist , werde ich es hinzufügen. Diese Technik verwendet eine benutzerdefinierte AsyncTask, die in Ihrer Aktivitätsklasse deklariert werden sollte.
Wenn Sie also Ihre Datei hochladen möchten, rufen Sie einfach an:
quelle
Ich wollte einige Zeichenfolgen an den Backend-Server senden. Ich habe json nicht mit mehrteiligen verwendet, ich habe Anforderungsparameter verwendet.
Url würde so aussehen
Ich übergebe zwei Parameter (UUID und Typ) zusammen mit dem Hochladen der Datei. Hoffe, dies wird helfen, wer nicht die komplexen JSON-Daten zum Senden hat.
quelle
Sie können versuchen, die Bibliothek https://square.github.io/okhttp/ zu verwenden. Sie können den Anforderungshauptteil auf mehrteilig einstellen und dann die Datei- und JSON-Objekte wie folgt separat hinzufügen:
quelle
quelle
Bitte stellen Sie sicher, dass Sie folgenden Import haben. Natürlich andere Standardimporte
quelle
java.lang.ClassCastException: org.springframework.core.io.FileSystemResource cannot be cast to java.lang.String