Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi rest server wie muss das post Command aussehen oder welchen Server könnte ich verwend (https://www.delphipraxis.net/202320-rest-server-wie-muss-das-post-command-aussehen-oder-welchen-server-koennte-ich-verwend.html)

ScharfeMietze 19. Okt 2019 21:11


rest server wie muss das post Command aussehen oder welchen Server könnte ich verwend
 
Ich habe gerade ein Brett vor dem Kopf.
Ich habe einen test Restserver.
Diesen kann ich ohne Probleme über den Chrome Browser so ansprechen
Delphi-Quellcode:
https://xxx.xxxxx.myfritz.net/datasnap/rest/TServerMethods1/ReverseString/A%20B%20C/
als Antwort bekomme ich in chrome ...

Delphi-Quellcode:
{"result":["C B A"]}
da läuft also alles Palletti.

wenn ich aber das "poste"

Delphi-Quellcode:
const
Lurl = 'https://xxxx.xxxxxxxx/datasnap/rest/TServerMethods1/';
var
LsStream: TStringStream;
LsList: TStringList;
begin
LsList:= TStringList.Create;
LsStream := TStringStream.Create();
  try
    LsList.Add('ReverseString=abc');
    nthtprqst1.Post(Lurl,LsList,LsStream);
    Memo1.Lines.Add(LsStream.DataString) ;
  finally
    LsStream.Free;
    LsList.Free;
  end;
end;
bekomme ich als Antwort

Delphi-Quellcode:
{"error":"Ung\u00FCltiges Anforderungsformat. \/className\/methodName und etwaige Parameter erwartet."}
Wo ist da mein Denkfehler, wie sollte es aussehen?
Dank euch und Gruß

DeddyH 19. Okt 2019 21:18

AW: rest server wie muss das post command aussehen
 
Hast Du es mal mit GET statt POST versucht?

ScharfeMietze 19. Okt 2019 21:57

AW: rest server wie muss das post command aussehen
 
Delphi-Quellcode:
Lurl = 'https://xxxxxx7.myfritz.net/datasnap/rest/TServerMethods1/ReverseString/A%20B%20C/';
wenn ich das per get an den Server schicke
Kommt am server das result raus

Delphi-Quellcode:
server = C B A
das geht.


Der Client der am ende Daten schickt sendet nur Post
https://www.tradingview.com/blog/de/...ailable-14054/

Ich habe am (client)server der das post command schicken soll nur ein Feld für die url und ein Textfeld der auch als text gesendet wird und muss den Server drumrum bauen damit er eben diese lesen kann.

DeddyH 19. Okt 2019 22:03

AW: rest server wie muss das post command aussehen
 
Dann schau Dir einmal div. frameworks wie z.B. MARS an. Ich selber verwende für REST mit Delphi das Delphi MVC Framework und komme gut damit klar. Ob diese ganze Funktionalität mit Datasnap erreicht werden kann, weiß ich nicht, bezweifle das aber.

ScharfeMietze 19. Okt 2019 22:16

AW: rest server wie muss das post command aussehen
 
Es muss theoretisch kein Rest Server sein. Ich brauch halt eine einfache Lösung um diese webhooks zu empfangen.
da der DSHTTPWebDispatcher1 installiert ist, dachte ich ich das wäre damit möglich.

ScharfeMietze 19. Okt 2019 22:26

AW: rest server wie muss das post command aussehen
 
Mache ich es z.B. so

Delphi-Quellcode:
Lurl = 'https://xxxxx.myfritz.net/datasnap/';
var
LsStream,Lstream1: TStringStream;
LsList: TStringList;
begin
LsList:= TStringList.Create;
LsStream := TStringStream.Create();
  try
    LsList.Add('className=TServerMethods1');
    LsList.Add('ReverseString=abc');
    nthtprqst1.post(Lurl,LsList,LsStream);
    Memo1.Lines.Add('Client = ' +LsStream.DataString) ;
  finally
    LsStream.Free;
    LsList.Free;
  end;
end;

bekomme ich vom Server als Antwort das

Delphi-Quellcode:
Client = In Anforderung / angegebenes Protokoll wird nicht unterstützt. Folgende Protokolle werden aktuell unterstützt: rest, json, tunnel

DeddyH 19. Okt 2019 22:37

AW: rest server wie muss das post command aussehen
 
Du müsstest halt wissen, wie die Daten aussehen, die der Client sendet. Ich tippe mal ins Blaue und vermute, es handelt sich um einen Payload in JSON. Das müsste aber in der Doku stehen, ansonsten könntest Du mit Wireshark mitsniffen und Dir die gesendeten Daten anschauen.

ScharfeMietze 19. Okt 2019 23:02

AW: rest server wie muss das post command aussehen
 
https://www.tradingview.com/blog/de/...ailable-14054/ Ich habe nur was dort drin steht ...

Aviator 20. Okt 2019 10:08

AW: rest server wie muss das post command aussehen
 
Zitat:

Zitat von DeddyH (Beitrag 1449954)
Du müsstest halt wissen, wie die Daten aussehen, die der Client sendet. Ich tippe mal ins Blaue und vermute, es handelt sich um einen Payload in JSON. Das müsste aber in der Doku stehen, ansonsten könntest Du mit Wireshark mitsniffen und Dir die gesendeten Daten anschauen.

Das das HTTPS ist wird das wohl schwierig. Da müsste dann wahrscheinlich eher Fiddler dazwischengehängt werden. Bei Wireshark kann man zwar glaube ich auch Zertifikate einlesen, aber das habe ich noch nie ausprobiert.

ScharfeMietze 20. Okt 2019 10:56

AW: rest server wie muss das post command aussehen
 
Mir wäre auch wirklich erstmal geholfen wie ich post Daten an den Server schicke. Und oder falls ich den Server konfigurieren muss ... wie ich das tun sollte.
Ich könnte auch einen Soap Server nehmen. Hauptsache ich kann irgendwie Post Daten verarbeiten.

Aviator 20. Okt 2019 11:04

AW: rest server wie muss das post command aussehen
 
Hast du denn mal versucht, einen POST Request per cURL an den Server zu senden? Nicht das dein Delphi Code evtl. nur einen Fehler hat. Oder per PowerShell mit Invoke-WebRequest? Du könntest auch PostMan dafür verwenden, aber cURL sollte in dem Fall zum Testen bereits ausreichen.

ScharfeMietze 20. Okt 2019 11:43

AW: rest server wie muss das post command aussehen
 
Mein Problem ist das ich normal nicht viel mit Servern zu tun habe. Ich rate mit der Syntax nur rum. Leider finde ich trotz tagelanger suche nicht wirklich was brauchbares. Ein Beispiel für einen einfachen Server in dem Postdata empfangen und verarbeitet werden würden mir schon reichen. Ich dachte das wäre auch mit einem Restserver einfach zu lösen... zumal es ja über einfache Browserzeile funktioniert.

Aviator 20. Okt 2019 11:45

AW: rest server wie muss das post command aussehen
 
Ein Browser sendet bei einer Eingabe in die Adresszeile aber immer nur ein GET Request. Ist denn überhaupt sichergestellt, dass dein Server POST Requests akzeptiert?

ScharfeMietze 20. Okt 2019 12:50

AW: rest server wie muss das post command aussehen
 
Genau das ist ja die Frage. Wie muss ich den Server einstellen, damit er post empfängt und wie verarbeite ich diese. Ich dachte das ein Server der mit get umgehen kann auch post Daten verarbeiten kann. Falls nein Was muss ich am Server tun damit er Post Daten empfangen kann?

als beispiel von Telegramm
The short version
You'll need a server that:

Supports IPv4, IPv6 is currently not supported for Webhooks.
Accepts incoming POSTs from subnets 149.154.160.0/20 and 91.108.4.0/22 on port 443, 80, 88, or 8443.

und eine Post message von Telegramm sähe so aus.

Delphi-Quellcode:
curl --tlsv1 -v -k -X POST -H "Content-Type: application/json" -H "Cache-Control: no-cache" -d '{
"update_id":10000,
"message":{
  "date":1441645532,
  "chat":{
     "last_name":"Test Lastname",
     "id":1111111,
     "first_name":"Test",
     "username":"Test"
  },
  "message_id":1365,
  "from":{
     "last_name":"Test Lastname",
     "id":1111111,
     "first_name":"Test",
     "username":"Test"
  },
  "text":"/start"
}
}' "https://YOUR.BOT.URL:YOURPORT/"

Wie muss ich welchen Server aufsetzen damit ich diese Daten empfangen und lesen kann.

Olli73 21. Okt 2019 11:13

AW: rest server wie muss das post command aussehen
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1449975)
Wie muss ich welchen Server aufsetzen damit ich diese Daten empfangen und lesen kann.

Dein Server-Projekt sollte ein Webmodule beinhalten und dieses hat die Eigenschaft "Actions". Dort musst du eine "POST-Action" hinzufügen und den Code dafür schreiben (der Inhalt des Posts steht in Request.Content).

Deine "ReverseString-Action" mit der du testest ist wohl als "GET-Action" deklariert.

ScharfeMietze 21. Okt 2019 12:15

AW: rest server wie muss das post command aussehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Olli73 (Beitrag 1450010)
Dein Server-Projekt sollte ein Webmodule beinhalten und dieses hat die Eigenschaft "Actions". Dort musst du eine "POST-Action" hinzufügen und den Code dafür schreiben (der Inhalt des Posts steht in Request.Content).

Deine "ReverseString-Action" mit der du testest ist wohl als "GET-Action" deklariert.

Okay gefunden habe ich es und habe es hinzugefügt. Stimmt der ansatz so wie im bild?

Gibt es irgendwo Beispiele in die ich mich einlesen kann um den Code zu schreiben? Weil Google gibt nicht wirklich was dazu her *seuftz*
Aber dickes DANKE! Da bin ich schon mal einen kleinen Schritt weiter

Olli73 21. Okt 2019 12:51

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Bei MethodType würde ich noch mtPost angeben, ansonsten sieht es schon mal gut aus.

Im onAction kannst du sowas machen:
Delphi-Quellcode:
var
  S: String;
begin
  S := Request.Content;
  S := 'Empfangen: ' + S; // Daten verarbeiten
  Response.Content := S;
end;
Aufrufen musst du das ganze dann mit ".../webhook".

ScharfeMietze 21. Okt 2019 14:38

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Olli73 (Beitrag 1450015)
Bei MethodType würde ich noch mtPost angeben, ansonsten sieht es schon mal gut aus.

Aufrufen musst du das ganze dann mit ".../webhook".

Ich bin zwar weiter aber nicht am Ziel
auf der Clientseite sieht es so aus
Delphi-Quellcode:
procedure TfClient.btn1Click(Sender: TObject);
const
  Url = 'https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1/Webhook';
var
  LsList: TStringList;
  LsStream: TStringStream;
begin
LsList := TStringlist.Create;
  try
  LsStream := TStringStream.Create;
    try
      LsList.Add('abc=Test Client');
      nthtprqst1.Post(Url,LsList,LsStream) ;
      mmo1.Lines.Add(UTF8Decode(LsStream.DataString));
    finally
      LsStream.Free;
    end; // try
  finally
    LsList.Free;
  end; // try

end;
und ich erhalte folgende Meldung {"error":"Methode TServerMethods1.updateWebhook in der Servermethodenliste nicht gefunden"}
vorher bekam ich {"error":"Methode TServerMethods1.Webhook in der Servermethodenliste nicht gefunden"}
darauf wurde
Delphi-Quellcode:
type
  TServerMethods1 = class(TDSServerModule)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    function EchoString(Value: string): string;
    function ReverseString(Value: string): string;
    function Webhook(Value: string): string;
  end;

function TServerMethods1.Webhook(Value: string): string;
begin
  Result := Value;
  fConnect.Memo1.Lines.Add('Webhook ' + Result);
end;
hinzugefügt.

Die
Delphi-Quellcode:
procedure TWebModule1.WebModule1WebhookAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  S: String;
begin
  S := Request.Content;
  S := 'Empfangen: ' + S; // Daten verarbeiten
  fWebhook.mmo('TWebModule1.WebModule1Webhook : ' +  Request.Content );
  Response.Content := S;
end;
ist wie von @Olli73 angegeben über onAction bearbeitet. siehe Bild


Was mich wundert ist
ich sende an
Delphi-Quellcode:
https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1/Webhook
"webhook"
und
ich erhalte einen Fehler weil
Delphi-Quellcode:
{"error":"Methode TServerMethods1.updateWebhook in der Servermethodenliste nicht gefunden"}
"updatewebhook fehlt.
Ich google nun schon eine weile weil ich nicht weiß was in die function rein muss die er haben möchte. bin aber noch nicht fündig geworden. Wenn Olli73 oder andere noch Tipps hätten wäre das kurz vor dem Ziel super..

ScharfeMietze 21. Okt 2019 14:47

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
kleines update
von mir wurde nun in ServerMethods1

Delphi-Quellcode:
function TServerMethods1.updateWebhook(Value: string): string;
begin
  Result := Value;
  fConnect.Memo1.Lines.Add('Webhook ' + Result);
end;
die function eingebaut. neue fehlermeldung ist nun von der Clientseite

Delphi-Quellcode:
{"error":"Nachrichteninhalt ist kein g\u00FCltiger JSON-Wert."}

ScharfeMietze 21. Okt 2019 14:59

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
update...

auf der Clentseite habe ich nun Json eingefügt.
Delphi-Quellcode:
procedure TfClient.btn1Click(Sender: TObject);
const
  Url = 'https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1/Webhook';
var
  LsList: TStringList;
  LsStream: TStringStream;
begin
LsList := TStringlist.Create;
  try
  LsStream := TStringStream.Create;
    try
      LsList.Add('{"Hasta":"Lavista Baby "}');
      nthtprqst1.Post(Url,LsList,LsStream) ;
      mmo1.Lines.Add(UTF8Decode(LsStream.DataString));
    finally
      LsStream.Free;
    end; // try
  finally
    LsList.Free;
  end; // try

end;


als Result bekomme ich nun auf der Clientseite


Delphi-Quellcode:
{"result":[""]}

und auf dem server bleibt das Json "verschollen".
wenn wenn mir nun noch jemand helfen könnte das im Nirvana verschollene Json zu finden, wäre das super...

Edelfix 21. Okt 2019 15:17

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Bei
Delphi-Quellcode:
nthtprqst1.post(Lurl,LsList,LsStream);
is LsList die Parameter liste und nicht der Body.

Rolf Frei 21. Okt 2019 15:44

AW: rest server wie muss das post command aussehen
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1449972)
Mein Problem ist das ich normal nicht viel mit Servern zu tun habe. Ich rate mit der Syntax nur rum. Leider finde ich trotz tagelanger suche nicht wirklich was brauchbares. Ein Beispiel für einen einfachen Server in dem Postdata empfangen und verarbeitet werden würden mir schon reichen. Ich dachte das wäre auch mit einem Restserver einfach zu lösen... zumal es ja über einfache Browserzeile funktioniert.

Lade dir mal Postman runter. Damit kannst du alles machen was auch ein Browser macht, also auch Posts, etc. Das Tool ist eigentlich pflicht, wenn man so Sachen wie SOAP oder REST macht.

https://www.getpostman.com/downloads/

Dass dein Post nicht funktioniert, wird daran liegen, dass du deine Daten nicht im JSON Fomat sendest. Eventuell brauchst es auch noch einen speziellen REST-Header, glaube aber nicht.

Das JSON, das du beim Post als Body schicken musst, müsste in etwas so ausehen:
Code:
{
  "update_id":10000,
  "message":
  {
    "date":1441645532,
    "chat":
    {
      "last_name":"Test Lastname",
      "id":1111111,
      "first_name":"Test",
      "username":"Test"
    },
    "message_id":1365,
    "from":
    {
      "last_name":"Test Lastname",
      "id":1111111,
      "first_name":"Test",
      "username":"Test"
    },
    "text":"/start"
  }
}

ScharfeMietze 21. Okt 2019 16:15

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Zitat:

Zitat von Edelfix (Beitrag 1450030)
Bei
Delphi-Quellcode:
nthtprqst1.post(Lurl,LsList,LsStream);
is LsList die Parameter liste und nicht der Body.

Könntest du das für blonde noch einmal aufarbeiten? Ich weiß du willst mir was sagen, aber es klickt noch nicht.

ScharfeMietze 21. Okt 2019 16:21

AW: rest server wie muss das post command aussehen
 
Zitat:

Zitat von Rolf Frei (Beitrag 1450033)
Zitat:

Zitat von ScharfeMietze (Beitrag 1449972)
Mein Problem ist das ich normal nicht viel mit Servern zu tun habe. Ich rate mit der Syntax nur rum. Leider finde ich trotz tagelanger suche nicht wirklich was brauchbares. Ein Beispiel für einen einfachen Server in dem Postdata empfangen und verarbeitet werden würden mir schon reichen. Ich dachte das wäre auch mit einem Restserver einfach zu lösen... zumal es ja über einfache Browserzeile funktioniert.

Lade dir mal Postman runter. Damit kannst du alles machen was auch ein Browser macht, also auch Posts, etc. Das Tool ist eigentlich pflicht, wenn man so Sachen wie SOAP oder REST macht.

https://www.getpostman.com/downloads/

Dass dein Post nicht funktioniert, wird daran liegen, dass du deine Daten nicht im JSON Fomat sendest. Eventuell brauchst es auch noch einen speziellen REST-Header, glaube aber nicht.

Das JSON, das du beim Post als Body schicken musst, müsste in etwas so ausehen:
Code:
{
  "update_id":10000,
  "message":
  {
    "date":1441645532,
    "chat":
    {
      "last_name":"Test Lastname",
      "id":1111111,
      "first_name":"Test",
      "username":"Test"
    },
    "message_id":1365,
    "from":
    {
      "last_name":"Test Lastname",
      "id":1111111,
      "first_name":"Test",
      "username":"Test"
    },
    "text":"/start"
  }
}

Delphi-Quellcode:
LsList.Add('{"Hasta":"Lavista Baby "}');
habe ich geprüft es ist ein Valides Json.
Im Server werden die json daten noch gar nicht verarbeitet .. da ich sie ja bisher am Server nicht auftauchen..
Der server gibt ja eine leere meldung (ohne fehler zurück)

Olli73 21. Okt 2019 16:24

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Hast du mal in "TServerMethods1.updateWebhook" reindebugt, ob er reinspringt und welchen Wert Value hat?

Uwe Raabe 21. Okt 2019 16:37

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Was für einen Typ hat nthtprqst1 denn überhaupt?

ScharfeMietze 21. Okt 2019 16:39

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Olli73 (Beitrag 1450036)
Hast du mal in "TServerMethods1.updateWebhook" reindebugt, ob er reinspringt und welchen Wert Value hat?

Ja keines...
die funktion sieht so aus (nachdem ich sie geschrieben habe
Delphi-Quellcode:
function TServerMethods1.updateWebhook(Value: string): string;
begin
  Result := Value;
  fConnect.Memo1.Lines.Add('Webhook update' + Result);
end;
nach dem Post kommt siehe Bild

ScharfeMietze 21. Okt 2019 16:46

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1450037)
Was für einen Typ hat nthtprqst1 denn überhaupt?

Ist der Delphi hauseigene TNetHTTPClient und Request mit unveränderten Einstellungen. Tut in der Regel klaglos seinen Dienst.

ScharfeMietze 21. Okt 2019 17:00

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Ps: Ich lasse den Server auch gerade mal etwas laufen. Wer möchte kann es gerne testen unter
https://alpt.kxmwm3epa9wmpje7.myfritz.net/

https://alpt.kxmwm3epa9wmpje7.myfrit...ing/A%20B%20C/

oder
https://alpt.kxmwm3epa9wmpje7.myfrit...ook/C%20B%20A/


Über den Browser wenn ich es in Chrome eingebe läuft es. Nur nicht via Post, was es aber muss...

Rolf Frei 21. Okt 2019 18:10

AW: rest server wie muss das post command aussehen
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1450035)
Delphi-Quellcode:
LsList.Add('{"Hasta":"Lavista Baby "}');
habe ich geprüft es ist ein Valides Json.
Im Server werden die json daten noch gar nicht verarbeitet .. da ich sie ja bisher am Server nicht auftauchen..
Der server gibt ja eine leere meldung (ohne fehler zurück)

Ja nur dass der Server mit diesem minimal JSON nichts anfangen kann. Du musst schon was schicken, das der Server auch verarbeiten kann. Gemäss deinem Beispiel einige Nachrichten früher, müsstest du mein JSON Beispiel nutzen oder halt so formatieren, wie der Server die Daten benötigt. Mit einem simplen {"Hasta":"Lavista Baby "} wird der Server nichts anfangen können. Die JSON Daten müssten serverseitig im Actionevent OnAction in Request.Content zu finden sein.

Könntest du denn bitte auch den Serverteil hier reinposten. Was du im Client machst ist ja nun klar, aber was machst du mit der Anfrage serverseitig? Wie verarbeitset du diese dort? Irgendwas wird da gemacht, sonst würdest du eine leere Antwort bekommen, ohne Inhalt. Du bekommst ja aber ein JSON retour.

ScharfeMietze 21. Okt 2019 18:51

AW: rest server wie muss das post command aussehen
 
Zitat:

Zitat von Rolf Frei (Beitrag 1450042)
Zitat:

Zitat von ScharfeMietze (Beitrag 1450035)
Delphi-Quellcode:
LsList.Add('{"Hasta":"Lavista Baby "}');
habe ich geprüft es ist ein Valides Json.
Im Server werden die json daten noch gar nicht verarbeitet .. da ich sie ja bisher am Server nicht auftauchen..
Der server gibt ja eine leere meldung (ohne fehler zurück)

Ja nur dass der Server mit diesem minimal JSON nichts anfangen kann. Du musst schon was schicken, das der Server auch verarbeiten kann. Gemäss deinem Beispiel einige Nachrichten früher, müsstest du mein JSON Beispiel nutzen oder halt so formatieren, wie der Server die Daten benötigt. Mit einem simplen {"Hasta":"Lavista Baby "} wird der Server nichts anfangen können. Die JSON Daten müssten serverseitig im Actionevent OnAction in Request.Content zu finden sein.

Könntest du denn bitte auch den Serverteil hier reinposten. Was du im Client machst ist ja nun klar, aber was machst du mit der Anfrage serverseitig? Wie verarbeitset du diese dort?

Auf dem Server ist noch nichts dergleichen. Es ist der reine Standard.
Ich weiß auch vorher nicht was für Daten vom Webhook gesendet werden. (Das ist teilweise nicht mal json sondern z.B nur normaler Text.) Der Server muss es auch im Anschluss nur speichern. Die Auswertung machen andere Tools die dann auf das gespeicherte zugreifen.

Die Ausgangssituation ist das Werbedienste wie z.B. Telegramm Daten an den Server via "post" schicken. Ich brauche einfach diese "Rohdaten" die via post geschickt werden.
Der Server muss den Client auch nichts verarbeitetes antworten. ein ok für den Empfang reicht...



Hier die Serverseite WebModuleUnit1
Delphi-Quellcode:
unit WebModuleUnit1;

interface

uses
  System.SysUtils, System.Classes, Web.HTTPApp, Datasnap.DSHTTPCommon,
  Datasnap.DSHTTPWebBroker, Datasnap.DSServer,
  Web.WebFileDispatcher, Web.HTTPProd,
  DataSnap.DSAuth,
  Datasnap.DSProxyJavaScript, IPPeerServer, Datasnap.DSMetadata,
  Datasnap.DSServerMetadata, Datasnap.DSClientMetadata, Datasnap.DSCommonServer,
  Datasnap.DSHTTP;

type
  TWebModule1 = class(TWebModule)
    DSHTTPWebDispatcher1: TDSHTTPWebDispatcher;
    ServerFunctionInvoker: TPageProducer;
    ReverseString: TPageProducer;
    WebFileDispatcher1: TWebFileDispatcher;
    DSProxyGenerator1: TDSProxyGenerator;
    DSServerMetaDataProvider1: TDSServerMetaDataProvider;
    procedure ServerFunctionInvokerHTMLTag(Sender: TObject; Tag: TTag;
      const TagString: string; TagParams: TStrings; var ReplaceText: string);
    procedure WebModuleDefaultAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    procedure WebModuleBeforeDispatch(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    procedure WebFileDispatcher1BeforeDispatch(Sender: TObject;
      const AFileName: string; Request: TWebRequest; Response: TWebResponse;
      var Handled: Boolean);
    procedure WebModuleCreate(Sender: TObject);
    procedure WebModule1WebhookAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);

  private
    { Private-Deklarationen }
    FServerFunctionInvokerAction: TWebActionItem;
    function AllowServerFunctionInvoker: Boolean;
  public
    { Public-Deklarationen }
  end;

var
  WebModuleClass: TComponentClass = TWebModule1;

implementation


{$R *.dfm}

uses ServerMethodsUnit1, ServerContainerUnit1, Web.WebReq, uWebhookData;

procedure TWebModule1.ServerFunctionInvokerHTMLTag(Sender: TObject; Tag: TTag;
  const TagString: string; TagParams: TStrings; var ReplaceText: string);
begin
  if SameText(TagString, 'urlpath') then
    ReplaceText := string(Request.InternalScriptName)
  else if SameText(TagString, 'port') then
    ReplaceText := IntToStr(Request.ServerPort)
  else if SameText(TagString, 'host') then
    ReplaceText := string(Request.Host)
  else if SameText(TagString, 'classname') then
    ReplaceText := ServerMethodsUnit1.TServerMethods1.ClassName
  else if SameText(TagString, 'loginrequired') then
    if DSHTTPWebDispatcher1.AuthenticationManager <> nil then
      ReplaceText := 'true'
    else
      ReplaceText := 'false'
  else if SameText(TagString, 'serverfunctionsjs') then
    ReplaceText := string(Request.InternalScriptName) + '/js/serverfunctions.js'
  else if SameText(TagString, 'servertime') then
    ReplaceText := DateTimeToStr(Now)
  else if SameText(TagString, 'serverfunctioninvoker') then
    if AllowServerFunctionInvoker then
      ReplaceText :=
      '<div><a href="' + string(Request.InternalScriptName) +
      '/ServerFunctionInvoker" target="_blank">Server Functions</a></div>'
    else
      ReplaceText := '';
end;

procedure TWebModule1.WebModuleDefaultAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  if (Request.InternalPathInfo = '') or (Request.InternalPathInfo = '/')then
    Response.Content := ReverseString.Content
  else
    Response.SendRedirect(Request.InternalScriptName + '/');
end;


procedure TWebModule1.WebModule1WebhookAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  S: String;
begin
  S := Request.Content;
  S := 'Empfangen: ' + S; // Daten verarbeiten
  fWebhook.mmo('TWebModule1.WebModule1Webhook : ' +  Request.Content );
  Response.Content := S;
end;

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  if FServerFunctionInvokerAction <> nil then
    FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker;
end;

function TWebModule1.AllowServerFunctionInvoker: Boolean;
begin
  Result := (Request.RemoteAddr = '127.0.0.1') or
    (Request.RemoteAddr = '0:0:0:0:0:0:0:1') or (Request.RemoteAddr = '::1');
end;

procedure TWebModule1.WebFileDispatcher1BeforeDispatch(Sender: TObject;
  const AFileName: string; Request: TWebRequest; Response: TWebResponse;
  var Handled: Boolean);
var
  D1, D2: TDateTime;
begin
  Handled := False;
  if SameFileName(ExtractFileName(AFileName), 'serverfunctions.js') then
    if not FileExists(AFileName) or (FileAge(AFileName, D1) and FileAge(WebApplicationFileName, D2) and (D1 < D2)) then
    begin
      DSProxyGenerator1.TargetDirectory := ExtractFilePath(AFileName);
      DSProxyGenerator1.TargetUnitName := ExtractFileName(AFileName);
      DSProxyGenerator1.Write;
    end;
end;

procedure TWebModule1.WebModuleCreate(Sender: TObject);
begin
  FServerFunctionInvokerAction := ActionByName('ServerFunctionInvokerAction');
  DSServerMetaDataProvider1.Server := DSServer;
  DSHTTPWebDispatcher1.Server := DSServer;
  if DSServer.Started then
  begin
    DSHTTPWebDispatcher1.DbxContext := DSServer.DbxContext;
    DSHTTPWebDispatcher1.Start;
  end;
  DSHTTPWebDispatcher1.AuthenticationManager := DSAuthenticationManager;
end;

initialization
finalization
  Web.WebReq.FreeWebModules;

end.





ServerMethods

Delphi-Quellcode:
Unit ServerMethodsUnit1;

interface

uses System.SysUtils, System.Classes, System.Json,
    DataSnap.DSProviderDataModuleAdapter,
    Datasnap.DSServer, Datasnap.DSAuth;

type
  TServerMethods1 = class(TDSServerModule)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    function EchoString(Value: string): string;
    function ReverseString(Value: string): string;
    function Webhook(Value: string): string;
    function updateWebhook(Value: string): string;
  end;

implementation


{$R *.dfm}


uses System.StrUtils, uConnectTVServer;

function TServerMethods1.EchoString(Value: string): string;
begin
  Result := Value;
  fConnect.Memo1.Lines.Add(Value);
end;

function TServerMethods1.ReverseString(Value: string): string;
begin
  Result := System.StrUtils.ReverseString(Value);
  fConnect.Memo1.Lines.Add('server = ' + Result);
end;

function TServerMethods1.updateWebhook(Value: string): string;
begin
  Result := Value;
  fConnect.Memo1.Lines.Add('Webhook update' + Result);
end;

function TServerMethods1.Webhook(Value: string): string;
begin
  Result := Value;
  fConnect.Memo1.Lines.Add('Webhook :' + Value);
end;

end.

ScharfeMietze 21. Okt 2019 19:51

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Nach weiterem Suchen habe ich hier das gefunden. http://docwiki.embarcadero.com/RADSt...aging_Protocol
Delphi-Quellcode:
Then your request should look like this:

POST /datasnap/rest/TServerMethods1/EchoAttribute/Attr1 HTTP/1.1
....*additional headers*...
Accept: application/json
Content-Type: text/plain;charset=UTF-8

{"Attr1":"ValueToReturn"}
Also habe ich mein Post so abgewandelt.


Delphi-Quellcode:
procedure TfClient.btn1Click(Sender: TObject);
const
  Url = 'https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1/Webhook';
var
  LsList: TStringList;
  LsStream: TStringStream;
begin
LsList := TStringlist.Create;
  try
  LsStream := TStringStream.Create;
    try
      LsList.Add('{"Webhook":"Lavista Baby "}');
      nthtprqst1.Post(Url,LsList,LsStream) ;
      mmo1.Lines.Add(UTF8Decode(LsStream.DataString));
    finally
      LsStream.Free;
    end; // try
  finally
    LsList.Free;
  end; // try

end;
aber weiterhin das gleiche Ergebnis

Delphi-Quellcode:
{"result":[""]}
als Antwort
Irgend etwas mach ich falsch:oops::pale:

Edelfix 22. Okt 2019 07:45

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Ich vermute dass der Fehler in dem POST Befehl steckt.
Dazu wird benötigt:
Die URL
Die Header Information
Die Parameter
Der Body
Welche Information an welcher Stelle bei TNetHTTPClient.Post gesetzt werden muss steht in der Delphi hilfe.

Oder in etwa so (schnelle kurz Fassung):

Delphi-Quellcode:
Function doGetData(sBody: String; url: String; var RPRec: TRPRec): Boolean;
var
  uri: TUri;
  srRQBody: TStringStream;
  RP: IHTTPResponse;
  sRQContent: String;
  sRPContent: String;
  srRPBody: TStringStream;
begin
    srRQBody:= TStringStream.Create;
    srRPBody:= TStringStream.Create;

    //-- URL
    try
      uri := TUri.Create(URL);
    except on E: Exception do
      sErr:= E.Message;
    end;

    //-- Params
    for I := 0 to slParams.Count-1 do
      uri.AddParameter(slParams.Names[i], slParams.ValueFromIndex[i]);
   
    //-- Auth
      SetAuth(RQRec);

    //-- Headers
    for I := 0 to slHeaders.Count-1 do
      NetHTTPClient1.CustomHeaders[slHeaders.Names[i]] := slHeaders.ValueFromIndex[i];

    //-- Body
    sRQContent := sBody;
    if RQRec.BodyMode='raw' then
    begin
      srRQBody.WriteString(sRQContent);
      srRQBody.Position := 0;
    end else
    if RQRec.BodyMode='x-www-form-urlencoded' then
    begin
      sRQContent := 'data'+'='+sRQContent;
      srRQBody.WriteString(sRQContent);
      srRQBody.Position := 0;
    end;


    RP := NetHTTPClient1.Post(uri.ToString, srRQBody, srRPBody);
    sRPContent := srRPBody.DataString;
    RPRec.StatusCode := RP.StatusCode;
    RPRec.StatusText := PChar(RP.StatusText);
    RPRec.ResponseText := PChar(sRPContent);
    if RPRec.StatusCode=200 then
      Result := true;
End;

ScharfeMietze 22. Okt 2019 11:24

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Zitat:

Zitat von Edelfix (Beitrag 1450051)
Ich vermute dass der Fehler in dem POST Befehl steckt.
Dazu wird benötigt:
Die URL
Die Header Information
Die Parameter
Der Body
Welche Information an welcher Stelle bei TNetHTTPClient.Post gesetzt werden muss steht in der Delphi hilfe.

Oder in etwa so (schnelle kurz Fassung):

Delphi-Quellcode:
Function doGetData(sBody: String; url: String; var RPRec: TRPRec): Boolean;

RPRec: TRPRec wird leider nicht erkannt:(
Mit dem Rest habe ich offensichtlich ein Problem.
zB.
Delphi-Quellcode:
https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1/Webhook/xbelibigedaten
funktioniert via url
Delphi-Quellcode:
Webhook update Key =xbelibigedaten
die serverseite dazu ist

Delphi-Quellcode:
function TServerMethods1.Webhook(Key: string; Data: string): string;
begin
  Result := Data;
  fConnect.Memo1.Lines.Add('Webhook Key =' + Key);
  fConnect.Memo1.Lines.Add('Webhook update Data =' + Data
  );
end;
Ich weiß nicht wo beim Post die URL aufhört und mit slash oder ohne
Delphi-Quellcode:
https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1/Webhook/     ?
https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1/Webhook   ?
https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1/    ?
https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1     ?
Wie müssen die Post Parameter aufgebaut sein? damit "xbelibigedaten" an die richtige url versendet werden?

Und
Falls ich etwas am Server tun muss damit er obiges empfängt, was?

Rolf Frei 22. Okt 2019 12:25

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Ich frage mich, ob du da nicht Probleme hast, weil du da Datasnap verwendest. Brauchst du das überhaupt? Soweit ich dein Problem verstehe, brauchst du keine Datasnap Funktionalität dafür, das macht es dir nur viel komplizierter oder eventuell sogar unmöglich, das zu machen was du eigentlich willst. DataSnap ist ein Delphi Framework, das hierzu glaube ich fehl am Platz ist.

Mach doch ein ganz normales Webmodul ohne Datasnap und handle dann alles so wie du es haben willst. Im Moment greifft dir da DS zu stark dazwischen und das wirkt alles viel zu kompliziert/überdiemnsioniert für deine Aufgabe. DS ist nicht dafür gemacht, was du da machen willst.

Kannst du eventuell nochmals genauer beschreiben, was du genau machen willst. Ist mir noch nicht so recht klar wie da der Ablauf sein soll. Da ist noch eine 3. Instanz im Spiel, die deine Webadresse aufruft und du willst da aus den übergebenen Daten etwas machen (Z.B. Speichern in einer DB). Ist das so richtig oder was fehlt da noch? Wenn das so ist, schmeiss den ganzen DS Teil wieder raus und verarbeite die Webabfrage im Webmodul so wie du sie benötigst. Du machst dir das mit dieser simplen Aufgabe mit dem DS Ansatz viel zu schwer.

ScharfeMietze 22. Okt 2019 12:48

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Zitat:

Zitat von Rolf Frei (Beitrag 1450062)
Ich frage mich, ob du da nicht Probleme hast, weil du da Datasnap verwendest. Brauchst du das überhaupt? Soweit ich dein Problem verstehe, brauchst du keine DataSnap Funktionalität dafür, das macht es dir nur viel komplizierter oder eventuell sogar unmöglich, das zu machen was du eigentlich willst. DataSnap ist ein Delphi framework, das hierzu glaube ich fehl am Platz ist.

Mach doch eine ganz normales Webmodul (nicht DSWebModul) und handle dann alles so wie du es haben willst. Im Moment greifft dir da DS zu stark dazwischen. DS ist nciht dafür gemacht, was du da machen willst.

Beim Rest Server bin ich gelandet weil der Rest auch immer irgendwo haperte. Bei nachinstallierten Komponenten wurde ipv6 nicht unterstüzt. Bei Indy ist das ssl gerne mal ein Problem mit dem IdHTTPServer konnte ich mir die die daten ausgeben lassen,scheitert bisher aber bei der Homeserver Https url... usw... Und der Restserver lief auf Anhieb klaglos
Wenn es irgendwo ein schönes Examlpe gibt für einen Server der das Geforderte kann bin ich jederzeit offen :) für neues..

Olli73 22. Okt 2019 13:02

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Versuch mal folgendes:

Die WebhookAction nimmst du wieder raus.
Die Funktion TServerMethods1.Webhook ebenfalls raus.

und dann sowas in der Art:

function TServerMethods1.updateWebhook(Value: TJSONObject): TJSONObject;
begin
Result := Value;
fConnect.Memo1.Lines.Add('Webhook update' + Value.ToJSON);
end;

Und das ganze dann mit ..../Webhook/ und einem JSON-Text im Body als "Post" posten.

Edelfix 22. Okt 2019 13:59

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Noch Detaillierter:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Net.URLClient,
  System.Net.HttpClient, System.Net.HttpClientComponent;

type
  TForm1 = class(TForm)
    Button1: TButton;
    NetHTTPClient1: TNetHTTPClient;
    procedure Button1Click(Sender: TObject);
  private
    sErr: string;
    slParams: TStringList;
    slHeaders: TStringList;
    Function doGetData(sBody, BodyMode, url: String; var sRP: String): Boolean;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  sBody: string;
  url: string;
  sRP: string;
  bodyMode: string;
begin
  slParams:= TStringList.Create;
  slHeaders:= TStringList.Create;
  try
    sBody := '{"Hasta":"Lavista Baby "}';
    bodyMode := 'raw';
    url:= 'deine Ziel URL';
    if doGetData(sBody,bodyMode,url,sRP) then
      showmessage(sRP);
  finally
    slParams.Free;
    slHeaders.Free;
  end;
end;

function TForm1.doGetData(sBody, BodyMode, url: String; var sRP: String): Boolean;
var
  uri: TUri;
  srRQBody: TStringStream;
  RP: IHTTPResponse;
  sRQContent: String;
  sRPContent: String;
  srRPBody: TStringStream;
  I: Integer;
  StatusCode: Integer;
  StatusText: String;
  ResponseText: String;
begin
  Result := false;
  srRQBody:= TStringStream.Create;
  srRPBody:= TStringStream.Create;
  try
    //-- URL
    try
      uri := TUri.Create(URL);
    except on E: Exception do
      sErr:= E.Message;
    end;

    //-- Params
    for I := 0 to slParams.Count-1 do
      uri.AddParameter(slParams.Names[i], slParams.ValueFromIndex[i]);

    //-- Auth
      //SetAuth(RQRec);

    //-- Headers
    for I := 0 to slHeaders.Count-1 do
      NetHTTPClient1.CustomHeaders[slHeaders.Names[i]] := slHeaders.ValueFromIndex[i];

    //-- Body
    sRQContent := sBody;
    if BodyMode='raw' then
    begin
      srRQBody.WriteString(sRQContent);
      srRQBody.Position := 0;
    end else
    if BodyMode='x-www-form-urlencoded' then
    begin
      sRQContent := 'data'+'='+sRQContent;
      srRQBody.WriteString(sRQContent);
      srRQBody.Position := 0;
    end;


    RP := NetHTTPClient1.Post(uri.ToString, srRQBody, srRPBody);
    sRPContent := srRPBody.DataString;
    StatusCode := RP.StatusCode;
    StatusText := RP.StatusText;
    ResponseText := sRPContent;
    if StatusCode=200 then
      Result := true;
  finally
    srRQBody.Free;
    srRPBody.Free;
  end;
end;

end.

Rolf Frei 22. Okt 2019 14:06

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1450066)
Zitat:

Zitat von Rolf Frei (Beitrag 1450062)
Ich frage mich, ob du da nicht Probleme hast, weil du da Datasnap verwendest. Brauchst du das überhaupt? Soweit ich dein Problem verstehe, brauchst du keine DataSnap Funktionalität dafür, das macht es dir nur viel komplizierter oder eventuell sogar unmöglich, das zu machen was du eigentlich willst. DataSnap ist ein Delphi framework, das hierzu glaube ich fehl am Platz ist.

Mach doch eine ganz normales Webmodul (nicht DSWebModul) und handle dann alles so wie du es haben willst. Im Moment greifft dir da DS zu stark dazwischen. DS ist nciht dafür gemacht, was du da machen willst.

Beim Rest Server bin ich gelandet weil der Rest auch immer irgendwo haperte. Bei nachinstallierten Komponenten wurde ipv6 nicht unterstüzt. Bei Indy ist das ssl gerne mal ein Problem mit dem IdHTTPServer konnte ich mir die die daten ausgeben lassen,scheitert bisher aber bei der Homeserver Https url... usw... Und der Restserver lief auf Anhieb klaglos
Wenn es irgendwo ein schönes Examlpe gibt für einen Server der das Geforderte kann bin ich jederzeit offen :) für neues..

Hast du meinen letzten nachträglich hinzugefügten Zusatz auch gelesen:

Kannst du eventuell nochmals genauer beschreiben, was du genau machen willst. Ist mir noch nicht so recht klar wie da der Ablauf sein soll. Da ist noch eine 3. Instanz im Spiel (ausser deinem Client und deinem Webserver), die deine Webadresse aufruft und du willst da aus den übergebenen Daten etwas machen (Z.B. Speichern in einer DB)? Ist das so richtig oder was fehlt da noch? Wenn das so ist, schmeiss den ganzen DS Teil wieder raus und verarbeite die Webabfrage im Webmodul so wie du sie benötigst. Du machst dir das mit dieser simplen Aufgabe mit dem DS Ansatz viel zu schwer.

Was hat es mit deinem geposteten Telegramm Code zu tun? Wozu brauchst du neben dem Webserver noch einen Client? Nur zum Testen?

Bbommel 22. Okt 2019 14:16

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Ich möchte mich Rolf da mal anschließen. Ich dachte, ich könnte vielleicht helfen, weil ich in letzter Zeit auch relativ viel Web-Zeug gemacht habe, aber ich verstehe nicht mal, was eigentlich die Frage bzw. das Problem ist. :-) In deinem ersten Beitrag hatte ich es so verstanden, dass du einen Client schreiben willst, aber dass der nicht funktioniert. Mittlerweile verstehe ich es so, dass du aber eigentlich den Server schreiben willst.

Beitrag #31 klang für mich so, als ob es darum geht, dass du einen Server schreiben willst, der einfach ALLE Anfragen an ihn, die ein Post sind, abfängt und irgendwo speichert. Dort sollen diese "Rohdaten" dann später analysiert werden. Ist das korrekt?

Falls ja, kann ich mich Rolf nur einmal mehr anschließen: schmeiß diesen DataSnap-Zeug weg. Mit einer einfachen WebBroker-Anwendung ist das schnell und einfach gemacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 Uhr.
Seite 1 von 2  1 2      

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