Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

AW: DataSnap - Zugriff von WebProjekt

  Alt 30. Jun 2020, 17:32
So, nach paar Tagen genervter Suche, endlich eine Lösung.
  • DataSnap ist blöd ... im XE über HTTP-REST (keine Lust das jetzt noch auf neuem Delphi zu probieren .... wird bestimmt eh noch ein Spaß DataSnap von XE auf 10.4 zu migrieren)
  • TStream-Parameter abrufen geht
  • TStream-Parameter senden knallt immer, egal ob aus neue generiertem DataSnap-Client oder manuell
  • abgerufen mit nur einem Result-Parameter "TStream" kommt es binär beim Client an (also perfekt, auch wenn der Content-Typ von "text/html; charset=ISO-8859-1" schwafelt, obwohl es Binädaten sind, wie z.B. ein PDF)
  • gesendet wird es als JSON-Array mit millionen Values/Integern ... je ein Integer pro Byte
  • abgesehn davon dass es nicht funktioniert (Exception NACH meiner DataSnap-Methode, selbst, vermutlich wenn anschließend der TStream freigegeben wird),
    lacht sich unser WebEntwickler doch mindestens zu tode und macht sich über Delphi/DataSnap lustig, wenn ich ihm sage wie das Format aussieht

Ich hab mich nun mühevoll durch das Senden des DataSnap-HTTP/REST-Clienten gekämpft und geschaut was gesendet wird.
Ja, es gibt eine nette Trace-Methode im Server, wo man das Protokoll loggen kann, allerdings wird die erst NACH der Verarbeitung aufgerufen, wo man dann Request und Response einsehen kann, aber da es schon vorher knallt und abraucht .........

TDSRestCommand.Execute
ExecuteCommand (DSClientRest)
ExecuteRequest (DSClientRest)
LParametersToSendInContent:=
ExecuteRequest> ParameterToJSon
TDBXJSONTools.StreamToJSON
Dabei ensteht ein JSON-Array mit sehr vielen Values/Integern pro Byte, locker 3 bis 4 Mal so viele Daten wie die Datei groß ist.

procedure TDSFileMethods.WriteFile(Filename: String; Stream: TStream);
Zitat von 10 Byte-Datei:
POST /DataSnap/REST/TDSFileMethods/%22WriteFile%22/rechnung%5C1192.pdf HTTP/1.1
Host: ***
Authorization: Basic ***
Accept: application/JSON
Content-Type: text/plain;charset=UTF-8
If-Modified-Since: Mon, 1 Oct 1990 05:00:00 GMT
Content-Length: 26

[0,1,2,3,4,5,6,32,128,255]
Ich würde jetzt einfach die Datei als Base64 in einem JSON-String entgegen nehmen.

Mit einem Delphi-Client könnte ich meine Lösung nicht umsetzen, da DataSnap alle String-Parameter ohne Längenprüfung in die URL einbaut (in XE) und nur Tabellen/Streams/Json als JSON via POST sendet (siehe ExecuteRequest und IsUrlParameter in DSClientRest),
aber zum Glück kann man das bei manuellem REST-Aufruf das anpassen (eine beliebige Anzahl der Parameter in der URL und ab beliebiger Quelle geht's weiter im JSON-Request).

Wichtig ist aber dass man Accept und Content-Type nicht vergisst, denn so wie im Response der Content-Type totaler Schwachsinn ist, darf man ihm im Request aber nicht vergessen, sonst werden die POST-Daten zwar zwangsweise als JSON entgegen genommen (oder es knallt) aber dann einfach still und heimlich ignoriert (POST-Parameter bleiben leer und TStream ist nil).

Hab das mal mit ReverseString ausprobiert
function TDSServerMethods.ReverseString(S: String): String;
Zitat:
GET /DataSnap/REST/TDSServerMethods/ReverseString/ABC12345 HTTP/1.1
Host: *****
Accept: */*
Authorization: Basic *****
Zitat:
POST /DataSnap/REST/TDSFileMethods/%22ReverseString%22 HTTP/1.1
Host: *****
Authorization: Basic *****
Accept: application/JSON
Content-Type: text/plain;charset=UTF-8
If-Modified-Since: Mon, 1 Oct 1990 05:00:00 GMT
Content-Length: 29

{"_parameters":["123456789"]}
liefert Beides
Zitat:
{"result":["987654321"]}
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (30. Jun 2020 um 18:13 Uhr)
  Mit Zitat antworten Zitat