![]() |
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:
als Antwort bekomme ich in chrome ...
https://xxx.xxxxx.myfritz.net/datasnap/rest/TServerMethods1/ReverseString/A%20B%20C/
Delphi-Quellcode:
da läuft also alles Palletti.
{"result":["C B A"]}
wenn ich aber das "poste"
Delphi-Quellcode:
bekomme ich als Antwort
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;
Delphi-Quellcode:
Wo ist da mein Denkfehler, wie sollte es aussehen?
{"error":"Ung\u00FCltiges Anforderungsformat. \/className\/methodName und etwaige Parameter erwartet."}
Dank euch und Gruß |
AW: rest server wie muss das post command aussehen
Hast Du es mal mit GET statt POST versucht?
|
AW: rest server wie muss das post command aussehen
Delphi-Quellcode:
wenn ich das per get an den Server schicke
Lurl = 'https://xxxxxx7.myfritz.net/datasnap/rest/TServerMethods1/ReverseString/A%20B%20C/';
Kommt am server das result raus
Delphi-Quellcode:
das geht.
server = C B A
Der Client der am ende Daten schickt sendet nur Post ![]() 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. |
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.
|
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. |
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
|
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.
|
AW: rest server wie muss das post command aussehen
![]() |
AW: rest server wie muss das post command aussehen
Zitat:
|
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. |
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.
|
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.
|
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?
|
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. |
AW: rest server wie muss das post command aussehen
Zitat:
Deine "ReverseString-Action" mit der du testest ist wohl als "GET-Action" deklariert. |
AW: rest server wie muss das post command aussehen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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 |
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:
Aufrufen musst du das ganze dann mit ".../webhook".
var
S: String; begin S := Request.Content; S := 'Empfangen: ' + S; // Daten verarbeiten Response.Content := S; end; |
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
auf der Clientseite sieht es so aus
Delphi-Quellcode:
und ich erhalte folgende Meldung {"error":"Methode TServerMethods1.updateWebhook in der Servermethodenliste nicht gefunden"}
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; vorher bekam ich {"error":"Methode TServerMethods1.Webhook in der Servermethodenliste nicht gefunden"} darauf wurde
Delphi-Quellcode:
hinzugefügt.
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; Die
Delphi-Quellcode:
ist wie von @Olli73 angegeben über onAction bearbeitet. siehe Bild
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; Was mich wundert ist ich sende an
Delphi-Quellcode:
"webhook"
https://alpt.kxmwm3epa9wmpje7.myfritz.net/datasnap/rest/TServerMethods1/Webhook
und ich erhalte einen Fehler weil
Delphi-Quellcode:
"updatewebhook fehlt.
{"error":"Methode TServerMethods1.updateWebhook in der Servermethodenliste nicht gefunden"}
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.. |
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:
die function eingebaut. neue fehlermeldung ist nun von der Clientseite
function TServerMethods1.updateWebhook(Value: string): string;
begin Result := Value; fConnect.Memo1.Lines.Add('Webhook ' + Result); end;
Delphi-Quellcode:
{"error":"Nachrichteninhalt ist kein g\u00FCltiger JSON-Wert."}
|
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... |
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Bei
Delphi-Quellcode:
is LsList die Parameter liste und nicht der Body.
nthtprqst1.post(Lurl,LsList,LsStream);
|
AW: rest server wie muss das post command aussehen
Zitat:
![]() 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" } } |
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
Zitat:
Delphi-Quellcode:
habe ich geprüft es ist ein Valides Json.
LsList.Add('{"Hasta":"Lavista Baby "}');
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) |
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?
|
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?
|
AW: rest server wie muss das post Command aussehen oder welchen Server könnte ich ver
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
die funktion sieht so aus (nachdem ich sie geschrieben habe
Delphi-Quellcode:
nach dem Post kommt siehe Bild
function TServerMethods1.updateWebhook(Value: string): string;
begin Result := Value; fConnect.Memo1.Lines.Add('Webhook update' + Result); end; |
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
Ps: Ich lasse den Server auch gerade mal etwas laufen. Wer möchte kann es gerne testen unter
![]() ![]() oder ![]() Über den Browser wenn ich es in Chrome eingebe läuft es. Nur nicht via Post, was es aber muss... |
AW: rest server wie muss das post command aussehen
Zitat:
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. |
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:19 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