![]() |
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Zitat:
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"}
|
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Was passiert bei ContentType application/json ?
|
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Zitat:
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.... |
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Zitat:
|
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?
|
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Zitat:
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:
Hier kannst du jetzt machen, was du eigentlich willst, also etwa:
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;
Delphi-Quellcode:
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.
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; |
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Zitat:
Update es funktioniert.... Am server ist das Lesbar.
Delphi-Quellcode:
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.
16:55:12 {"Hasta":"Lavista Baby "}
|
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Zitat:
der Server
Delphi-Quellcode:
und die Client
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;
Delphi-Quellcode:
Der Derver gibt zurück
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;
Delphi-Quellcode:
Heureka! Data Saved =
|
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. |
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Zitat:
Daher muss der Server damit umgehen können. als Beispiel
Delphi-Quellcode:
Das funktioniert. nur leider nicht mit ipv6
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; Die Ausgabe ist folgende
Delphi-Quellcode:
Da die WebhookServer oft auf den Port 80 bestehen brauche ich einen Server der alle und alles empfängt.
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" |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:38 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-2025 by Thomas Breitkreuz