Delphi-PRAXiS
Seite 5 von 6   « Erste     345 6      

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 22. Okt 2019 14:46

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

Zitat von Olli73 (Beitrag 1450070)
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.


Im Server sieht es nun so aus

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

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

Gesendet habe ich es so


Delphi-Quellcode:
procedure TfClient.btn1Click(Sender: TObject);
const
  Url = 'https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1/Webhook/';
//  Url = 'https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1/Webhook/data/';
//POST /datasnap/rest/TServerMethods1/%22updateEchoAttribute%22/Attr1
var
  LsList: TStringList;
  LsStream: TStringStream;
begin
nthtpclnt1.ContentType:= 'application/x-www-form-urlencoded';
LsList := TStringlist.Create;
  try
  LsStream := TStringStream.Create;
    try
      LsList.Add('{"webhook":"John"}');
      nthtprqst1.Post(Url,LsList,LsStream, TEncoding.Default) ;
      mmo1.Lines.Add(UTF8Decode(LsStream.DataString));
    finally
      LsStream.Free;
    end; // try
  finally
    LsList.Free;
  end; // try
end;


Retour bekomme ich

Delphi-Quellcode:
{"error":"Ung\u00FCltige Typumwandlung"}

Olli73 22. Okt 2019 14:58

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Was passiert bei ContentType application/json ?

ScharfeMietze 22. Okt 2019 15:12

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

Zitat von Bbommel (Beitrag 1450073)
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.

Noch mal auf Anfang.

Es gibt im web diverse Webhooks, Telegramm, Tradingview, Discord usw.

Diese Server senden einfach Daten via Post Message. In der Post Message kann von Text bis Json enthalten sein.
Der Server soll einfach den Content speichern ... Das ist alles.
Wichtig für den Server ist.. ssl und ipv6/ipv4 muss er können. Zugriff nur über freigegebene IP.

Ich hab das z.B über die TClientSocket/TserverSocket hinbekommen. Nur funktionierte das nicht mit IPV6

Deswegen kam ich zum Testeten auf den Rest Server. Die Beispiel Echo Function liefert mir ja das was ich will, nur aktuell über Rest. Da ich schlicht davon ausging das es "einfach" wäre die Rest "GET" Zeile in eine Post Zeile zu verwandeln hab ich das Thema eröffnet. Zumal ja auch öfter zu lesen ist das der Server mit Post umgehen können sollte.
Gruß wenn euch was dazu einfällt immer her damit....

ScharfeMietze 22. Okt 2019 15:15

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

Zitat von Olli73 (Beitrag 1450079)
Was passiert bei ContentType application/json ?

das gleiche

Olli73 22. Okt 2019 15:18

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Hast du mal den Server im Debugger laufen lassen?

Bbommel 22. Okt 2019 15:37

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

Zitat von ScharfeMietze (Beitrag 1450081)
Diese Server senden einfach Daten via Post Message. In der Post Message kann von Text bis Json enthalten sein.
Der Server soll einfach den Content speichern ... Das ist alles.
Wichtig für den Server ist.. ssl und ipv6/ipv4 muss er können. Zugriff nur über freigegebene IP.

Okay, mein Ansatz wäre folgender:

Starte ein neues Projekt in Delphi: Datei->Neu->Weitere->WebBroker->Web Server Anwendung.
In dem folgenden Assistenten kannst du auch wählen, ob du das Ding als eigenständigen Server haben willst oder als IIS-Anhängsel. Für den Start am einfachsten: ein eigenständiger Server ("GUI-Einzelanwendung"). Dann kannst du auch noch im Assistenten auswählen, ob er dir HTTPS vorbereiten soll. IPv6 hat bei mir noch nie Probleme gemacht.

So, dann bekommst du von Delphi zwei Units erzeugt. Eine ist die GUI, mit der du den Server starten und stoppen kannst. Das andere ist das WebModul, mit dem du die eigentlichen Aktionen durchführen kannst, also die Antworten generieren kannst, die du an einen Client senden willst. Da funken dir dann (fast) keine Automatismen mehr dazwischen und du kannst genau kontrollieren, was hier passiert.

Bei dir ist es ja sehr einfach, weil du eigentlich nur eine Aktion brauchst, nämlich die Default-Aktion und die ist sogar schon da. Wechsel also im WebModul in die Code-Ansicht, dort findest du dann:

Delphi-Quellcode:
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.Content :=
    '<html>' +
    '<head><title>Webserver-Anwendung</title></head>' +
    '<body>Webserver-Anwendung</body>' +
    '</html>';
end;
Hier kannst du jetzt machen, was du eigentlich willst, also etwa:

Delphi-Quellcode:
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  if Request.MethodType=mtPost then begin
    SaveDataToFile(Request.Content);
    Response.Content:='Heureka! Data Saved!';
    Response.ContentType:='text/plain';
  end else begin
    Response.Content:='ich antworte nur auf POST!';
    Response.ContentType:='text/plain';
  end;
  Response.StatusCode:=200;
  Handled:=true;
end;
Dss war es auch schon. Nur das "SaveDataToFile" gibt es hier nicht, ist sozusagen eine Platzhalter für deine dann noch zu bastelnde Methode, damit du die Daten auch speichern kannst. Achtung: das müsstest du ggf. mit kritischen Abschnitten sichern, wenn du alle Daten in die selbe Datei schreibst, weil ja sonst zwei Threads zugleich in die Datei schreiben wollen.

ScharfeMietze 22. Okt 2019 16:06

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

Zitat von Edelfix (Beitrag 1450071)
Noch Detaillierter:

Ich bin dran. Beim ersten versuch hat es den Server zum absturz gebracht. Beim 2 Versuch scheint der Server Den Inhalt zu bekommen aber die Showmessage bleibt leer. Ich bin aber dran. Vielen Dank für deine Mühe. Wobei die Clientseite nur zum testen des Servers da sein sollte. An sich muss der Server einfach viel annehmen, da ich in der Regel keinen Zugriff auf den Server Habe der die Hooks sendet.

Update es funktioniert....
Am server ist das Lesbar.

Delphi-Quellcode:
16:55:12 {"Hasta":"Lavista Baby "}
Vielen Dank!! Damit bin ich nun schon weiter... nun muss ich nur sehen ob ich den Server so Flexibel bekomme das er möglichst viel akzeptiert. Wenn du da noch ein Tipp für mich hast wäre das super.

ScharfeMietze 22. Okt 2019 18:55

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

Zitat von Bbommel (Beitrag 1450087)


Okay, mein Ansatz wäre folgender:

Starte ein neues Projekt in Delphi: Datei->Neu->Weitere->WebBroker->Web Server Anwendung.
In dem folgenden Assistenten kannst du auch wählen, ob du das Ding als eigenständigen Server haben willst oder als IIS-Anhängsel. Für den Start am einfachsten: ein eigenständiger Server ("GUI-Einzelanwendung"). Dann kannst du auch noch im Assistenten auswählen, ob er dir HTTPS vorbereiten soll. IPv6 hat bei mir noch nie Probleme gemacht.

So, dann bekommst du von Delphi zwei Units erzeugt. Eine ist die GUI, mit der du den Server starten und stoppen kannst. Das andere ist das WebModul, mit dem du die eigentlichen Aktionen durchführen kannst, also die Antworten generieren kannst, die du an einen Client senden willst. Da funken dir dann (fast) keine Automatismen mehr dazwischen und du kannst genau kontrollieren, was hier passiert.

Bei dir ist es ja sehr einfach, weil du eigentlich nur eine Aktion brauchst, nämlich die Default-Aktion und die ist sogar schon da. Wechsel also im WebModul in die Code-Ansicht, dort findest du dann:



Dss war es auch schon. Nur das "SaveDataToFile" gibt es hier nicht, ist sozusagen eine Platzhalter für deine dann noch zu bastelnde Methode, damit du die Daten auch speichern kannst. Achtung: das müsstest du ggf. mit kritischen Abschnitten sichern, wenn du alle Daten in die selbe Datei schreibst, weil ja sonst zwei Threads zugleich in die Datei schreiben wollen.

Tya wass soll ich sagen, ich habe damit genau das gleiche Problem, das die Daten nicht ankommen.

der Server
Delphi-Quellcode:
procedure TWebModule2.WebModule2webhookAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  LsList: TStringList;
begin
if Request.MethodType=mtPost then
  begin
  LsList := TStringlist.Create;
    try
    LsList.Text:= Request.Content;
    LsList.SaveToFile('C:\Test\Test.txt');
    finally
      LsList.Free;
    end; // try
    fResponse.mmo1.Lines.Add(Request.Content);
    Response.Content:='Heureka! Data Saved = ' + Request.Content;
    Response.ContentType:='text/plain';
  end
else
  begin
    Response.Content:='ich antworte nur auf POST!';
    Response.ContentType:='text/plain';
  end;
  Response.StatusCode:=200;
  Handled:=true;
end;
und die Client

Delphi-Quellcode:
procedure TfClient.btn3Click(Sender: TObject);
const
  Url = 'https://alpt.kxmwm3epa9wmpje7.myfritz.net/webhook';
var
  LsList: TStringList;
  LsStream: TStringStream;
begin
LsList := TStringlist.Create;
  try
  LsStream := TStringStream.Create;
    try
      LsList.Add('{"Hastaaaaa":"Lavista Baby "}');
      nthtprqst1.Post(Url,LsList,LsStream, TEncoding.Default) ;
      mmo1.Lines.Add(LsStream.DataString);
    finally
      LsStream.Free;
    end; // try
  finally
    LsList.Free;
  end; // try
end;
Der Derver gibt zurück
Delphi-Quellcode:
Heureka! Data Saved =

Bbommel 22. Okt 2019 21:37

AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dein Problem ist dein Client, nicht der Server. Du gibst einen Text im JSON-Format an, setzt aber in deinem Client keinen Content-Type. Daher setzt der Client dann automatisch einen Content-Type, und zwar auf "x-www-form-url-encoded", was ziemlich spezfisch ist. Hier gibt es dann leider doch einen kleinen Automatismus auch im einfachen Web-Broker, weil der halt merkt, dass der Content so überhaupt nicht zum angegebenen Content-Type passt. Das heißt: in deinem Client musst du für den Request den Content-Type anpassen, damit du testen kannst - auf application/json oder auf text/plain (wie das beim TNetHTTPClient geht, hab ich noch nicht getestet, weil noch nicht gebraucht bisher).

Wie hier schon mal von jemand anderem geschrieben: es ist einfacher, wenn du für den Tests des Servers das Tool "Postman" nimmst, welches genau für so etwas da ist. Im Anhang ein Screenshot, bei dem du dann siehst, dass dann, wenn der Content-Type nicht komplett was anderes sagt als der Content, auch eine sinnvolle Antwort vom Server zurückkommt. Schau dir das Tool mal an - damit kannst du schnell und einfach "rumspielen" und deinen Server testen.

ScharfeMietze 23. Okt 2019 00:03

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

Zitat von Bbommel (Beitrag 1450091)
Dein Problem ist dein Client, nicht der Server. Du gibst einen Text im JSON-Format an, setzt aber in deinem Client keinen Content-Type. Daher setzt der Client dann automatisch einen Content-Type, und zwar auf "x-www-form-url-encoded", was ziemlich spezfisch ist. Hier gibt es dann leider doch einen kleinen Automatismus auch im einfachen Web-Broker, weil der halt merkt, dass der Content so überhaupt nicht zum angegebenen Content-Type passt. Das heißt: in deinem Client musst du für den Request den Content-Type anpassen, damit du testen kannst - auf application/json oder auf text/plain (wie das beim TNetHTTPClient geht, hab ich noch nicht getestet, weil noch nicht gebraucht bisher).

Wie hier schon mal von jemand anderem geschrieben: es ist einfacher, wenn du für den Tests des Servers das Tool "Postman" nimmst, welches genau für so etwas da ist. Im Anhang ein Screenshot, bei dem du dann siehst, dass dann, wenn der Content-Type nicht komplett was anderes sagt als der Content, auch eine sinnvolle Antwort vom Server zurückkommt. Schau dir das Tool mal an - damit kannst du schnell und einfach "rumspielen" und deinen Server testen.

Ich habe ja keinen Zugriff auf die Webhook Server "Clienten"

Daher muss der Server damit umgehen können.

als Beispiel
Delphi-Quellcode:
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Win.ScktComp;

type
  TfTVServer = class(TForm)
    srvrsckt1: TServerSocket;
    mmo1: TMemo;
    procedure srvrsckt1Accept(Sender: TObject; Socket: TCustomWinSocket);
    procedure srvrsckt1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    procedure mmoAdd(Value:string);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  fTVServer: TfTVServer;

implementation

{$R *.dfm}

procedure TfTVServer.mmoAdd(Value: string);
begin
mmo1.Lines.Add(TimeToStr(now) + ' Server : "' + Value + '"');
end;

procedure TfTVServer.srvrsckt1Accept(Sender: TObject; Socket: TCustomWinSocket);
begin
mmoAdd('Remotehost :' + Socket.RemoteHost);
mmoAdd('Remoteadress : ' +Socket.RemoteAddress);

end;

procedure TfTVServer.srvrsckt1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
mmoAdd('ReciveText : ' + Socket.ReceiveText);
end;
Das funktioniert. nur leider nicht mit ipv6

Die Ausgabe ist folgende
Delphi-Quellcode:
00:43:32 Server : "Remotehost :ec2-34-212-75-30.us-west-2.compute.amazonaws.com"
00:43:32 Server : "Remoteadress : 34.212.75.30"
00:43:32 Server : "ReciveText : POST / HTTP/1.1
Host: alpt.kxmwm3epa9wmpje7.myfritz.net
User-Agent: Go-http-client/1.1
Content-Length: 74
Content-Type: text/plain; charset=utf-8
Accept-Encoding: gzip

100.0 Kleiner als RSI PPO Divergence (55, 12, 26, 9, 2, 14) auf BTCUSD, 1D"
Da die WebhookServer oft auf den Port 80 bestehen brauche ich einen Server der alle und alles empfängt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:38 Uhr.
Seite 5 von 6   « Erste     345 6      

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-2025 by Thomas Breitkreuz