![]() |
AW: rest server wie muss das post command aussehen
Zitat:
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. |
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Nach weiterem Suchen habe ich hier das gefunden.
![]()
Delphi-Quellcode:
Also habe ich mein Post so abgewandelt.
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"}
Delphi-Quellcode:
aber weiterhin das gleiche Ergebnis
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;
Delphi-Quellcode:
als Antwort
{"result":[""]}
Irgend etwas mach ich falsch:oops::pale: |
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; |
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Zitat:
Mit dem Rest habe ich offensichtlich ein Problem. zB.
Delphi-Quellcode:
funktioniert via url
https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1/Webhook/xbelibigedaten
Delphi-Quellcode:
die serverseite dazu ist
Webhook update Key =xbelibigedaten
Delphi-Quellcode:
Ich weiß nicht wo beim Post die URL aufhört und mit slash oder ohne
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;
Delphi-Quellcode:
Wie müssen die Post Parameter aufgebaut sein? damit "xbelibigedaten" an die richtige url versendet werden?
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 ? Und Falls ich etwas am Server tun muss damit er obiges empfängt, was? |
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. |
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Zitat:
Wenn es irgendwo ein schönes Examlpe gibt für einen Server der das Geforderte kann bin ich jederzeit offen :) für neues.. |
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. |
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. |
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Zitat:
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? |
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 05:40 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