Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Multipart/form-data im Datasnap REST Server Apache Link Module (https://www.delphipraxis.net/204082-multipart-form-data-im-datasnap-rest-server-apache-link-module.html)

NickD 22. Apr 2020 07:47

Multipart/form-data im Datasnap REST Server Apache Link Module
 
Hallo zusammen,
ich versuche gerade eine Möglichkeit zu finden, mit der ich eine Datei an den Datasnap REST Server senden kann.
Bisher verwende ich Base64 Strings im JSON Body. Allerdings ist hier der Overhead recht groß.
Ich würde die Dateien gerne einfach per Multipart/form-data übertragen, weiß aber absolut nicht wie ich diese im Datasnap verarbeiten kann.
Konnte hierzu auch im Netz bisher keine Beispiele finden.

Ich binde den Datasnao REST als Apache Module ein.
Folgende Komponenten stehen mir im TWebModule zur Verfügung:
- TDSServer
- TDSServerClass
- TDSHTTPWebDispatcher
- TDSAuthenticationManager
- und natürlich das TwebModul selbst

Ich weiß leider nicht wo ich ansetzen muss um die Dateien "entgegen zu nehmen" und dann lokal zu speichern.
Ich hoffe ihr habt hier einen Ansatz für mich.

Danke.

Grüße Nick.

himitsu 22. Apr 2020 09:28

AW: Multipart/form-data im Datasnap REST Server Apache Link Module
 
Du kannst direkt einen TStream als Parameter oder Result einer DataSnap-Methode verwenden.

Aber Achtung, ab etwa 32 KB (über einer Blockgröße im Übertragungsweg) wird der Stream nicht sofort/direkt übertragen und weil da am Ziel eine spezielle TStream-Instanz ankommt, wo Size = -1 ist, kommen z.B. viele LoadFromStream-Funktionen nicht damit klar, welche vorm/beim Lesen auf die Size gucken.

Wir/Ich hatte daher das generierte DataSnap-Zeug nochmal bissl erweitert und kopiere beim Empfang (Server und Client) nochmal in einen eigenen TMemoryStream um.
Grund:
* entwededer ist Size >= 0, dann kann diese Instanz wie ein normaler TMemoryStream verwendet werden
* und bei Size < 0 muß man so lange Stream.Read machen, bis dort Result=0 sagt, dann ist man am Ende
** während dem Lesen wird dann vom DataSnap auch der Rest der Daten übertragen

NickD 22. Apr 2020 10:04

AW: Multipart/form-data im Datasnap REST Server Apache Link Module
 
Danke für die Info.
Ich frage mich nur wie ich das ganze dann Aufrufe.
Sagen wir mal ich habe die REST Funktion:

Code:
function UploadFile(AStream: TStream): Integer;
Der Aufruf soll aus einer nativen Android App(Java) ausgeführt werden.
Rufe ich das dann auch als Multipart/form-data auf oder muss ein Stream direkt an die Funktion im Body übergeben werden?

Um eine Post-Funktion auszuführen muss vor die REST-Funktion ja noch das Präfix "upload" gesetzt werden. Ich meine mal gelesen zu haben, dass dort immer ein JSON-Object verlangt wird sobald dieses Präfix gesetzt ist.

Gibt es sonst noch eine Möglichkeit den Multipart zu verarbeiten?

mkinzler 22. Apr 2020 10:10

AW: Multipart/form-data im Datasnap REST Server Apache Link Module
 
Oder man nimmt die Funktionen von RESt ( HTTP[s] PUT usw.)

NickD 22. Apr 2020 10:37

AW: Multipart/form-data im Datasnap REST Server Apache Link Module
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe jetzt noch etwas entdeckt, was mir eventuell helfen könnte.
Das TWebModule kann verschiedene TWebActionItems verwenden um auf GET, POST, PUT, etc. zu reagieren.
Werde das damit mal testen.

Im Anhang noch ein Screenshot vom Objektinspektor.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz