AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi DataSnap - Zugriff von WebProjekt
Thema durchsuchen
Ansicht
Themen-Optionen

DataSnap - Zugriff von WebProjekt

Ein Thema von himitsu · begonnen am 29. Jun 2020 · letzter Beitrag vom 30. Jun 2020
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: DataSnap - Zugriff von WebProjekt

  Alt 30. Jun 2020, 18: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"]}
Ein Therapeut entspricht 1024 Gigapeut.

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz