Senden von Binärdaten (Rails) Rest-Endpunkt über JSON/XML?
Ich bin derzeit dabei, gemeinsam eine rails-basierte web-Anwendung, die nur dienen und empfangen von Daten via json und xml. Jedoch einige Anforderungen enthalten die Fähigkeit, upload-Binärdaten (Bilder).
Nun zu meinem Verständnis JSON ist nicht ganz gedacht... aber wie tun Sie im Allgemeinen gegen das problem der Empfang von binären Dateien/Daten über diese beiden entrypoints zu Ihrer Anwendung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schlage ich vor, die Codierung der Binärdaten in so etwas wie base64. Dies würde machen es sicher für die Verwendung in XML-oder JSON-format.
http://en.wikipedia.org/wiki/Base64
vielleicht könnten Sie einen Blick auf Base64 Algorithmus.
Diese wird verwendet, um die "transform" - alles, was in ascii-char.
Sie können code und entschlüsseln. Es ist für webservices, oder auch auf dotnet-Serialisierung.
Hoffe, das hilft ein wenig.
Edit: ich sah "neue post", beim posten, war jemand schneller.Schienen base64
Wenn Sie mit Rails und json und xml als HTTP. "POST" ist ein Teil der HTTP-und der beste Weg, zu transformieren von binären Daten. Base64 ist ein sehr ineffizienter Weg, dies zu tun.
Wenn Ihr server Daten sendet, würde ich empfehlen, einen Pfad zu der Datei auf dem server im XML-oder JSON. Auf diese Weise wird Ihr server nicht in base64-Kodierung der Daten und Ihre AUFTRAGGEBER, die bereits unterstützt werden HTTP GET, können pull-down-Daten ohne Decodierung. (GET /Pfad/zur/Datei)
Für das senden von Dateien, haben Sie Ihre server und/oder client generiert einen eindeutigen Dateinamen und verwenden Sie eine zwei-Schritt-Prozess; der client sendet die xml-oder json-Nachricht mit fileToBeUploaded: "name der Datei.extern" und wird nach Absenden der Meldung-POST-Daten mit dem oben genannten Dateinamen. Wieder, client und server müssen nicht codieren und decodieren der Daten. Diese kann getan werden, mit einer Anfrage über ein multi-Teil verlangen.
Base64 ist einfach, aber wird schnell zu kauen, bis CPU und/oder Speicher, je nach Größe der Daten und die Häufigkeit der Anfragen. Auf der server-Seite, es ist auch nicht eine operation, die zwischengespeichert wird, in der Erwägung, dass der Betrieb Ihrer web-server Lesen der Datei von der Festplatte ist.
Wenn Ihre Bilder nicht zu groß sind, um Sie in der Datenbank mit einem RoR :Typ binary macht sehr viel Sinn. Wenn Sie Datenbank-Replikate, die Bilder kopiert, kostenlos zu anderen Seiten, es gibt keine Besorgnis über verwaiste oder verwitwete Bilder, und die atomic transaction Fragen werden weitaus einfacher.
Auf der anderen Seite, Nessence richtig ist, dass Base64, als mit irgendeiner Kodierung Schicht, hinzufügen-Netzwerk -, Speicher-und CPU-Last der Transaktionen. Wenn die Netzwerk-Bandbreite ist Ihr top-Thema, stellen Sie sicher, dass Ihre web-service akzeptiert und bietet deflate/gzip-komprimierte verbindungen. Dies reduziert die Kosten für die Base64-Daten auf dem Netzwerk-layer, wenn auch auf Kosten der selbst mehr Speicher-und CPU-Last.
Diese sind architektonische Themen, die diskutiert werden sollte, mit Ihrem team und/oder client.
Schließlich, lassen Sie mich Ihnen ein heads-up über RoR XML-REST-Unterstützung. Die Schienen
:binary
Datenbank geben wird<object type="binary" encoding="base64">...</object>
XML-Objekte beim Rendern von XML mithilfe von code wie folgt aus dem Standard-Gerüst:Dies funktioniert hervorragend für GET-Operationen, und die PUT-und POST-Operationen sind ebenso einfach zu schreiben. Der Haken ist, die Schienen SETZEN-und POST-Methoden nicht akzeptieren, die gleichen tags. Dies ist, weil die
from_xml
code nicht interpretierentype="binary"
tag, sondern sieht fürtype="binaryBase64"
. Es ist ein bug mit einem patch auf die Schienen Leuchtturm Ort, um dies zu korrigieren.