AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi rest server wie muss das post Command aussehen oder welchen Server könnte ich verwend
Thema durchsuchen
Ansicht
Themen-Optionen

rest server wie muss das post Command aussehen oder welchen Server könnte ich verwend

Ein Thema von ScharfeMietze · begonnen am 19. Okt 2019 · letzter Beitrag vom 23. Okt 2019
Antwort Antwort
Seite 5 von 6   « Erste     345 6      
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#41

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

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

{"error":"Ung\u00FCltige Typumwandlung"}
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
662 Beiträge
 
#42

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

  Alt 22. Okt 2019, 14:58
Was passiert bei ContentType application/json ?
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#43

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

  Alt 22. Okt 2019, 15:12
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....
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#44

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

  Alt 22. Okt 2019, 15:15
Was passiert bei ContentType application/json ?
das gleiche
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
662 Beiträge
 
#45

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

  Alt 22. Okt 2019, 15:18
Hast du mal den Server im Debugger laufen lassen?
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
648 Beiträge
 
Delphi 12 Athens
 
#46

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

  Alt 22. Okt 2019, 15:37
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.

Geändert von Bbommel (22. Okt 2019 um 15:56 Uhr) Grund: Soll keiner sagen können, ich hätte ein Semikolon vergessen...
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#47

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

  Alt 22. Okt 2019, 16:06
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.

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.
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#48

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

  Alt 22. Okt 2019, 18:55


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
Heureka! Data Saved =
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
648 Beiträge
 
Delphi 12 Athens
 
#49

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

  Alt 22. Okt 2019, 21:37
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.
Miniaturansicht angehängter Grafiken
postman.jpg  
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#50

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

  Alt 23. Okt 2019, 00:03
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 6   « Erste     345 6      


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 04:24 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