![]() |
Datenübertragung via HTTP POST
hier die Eckdaten:
Zugriff mit Datenformat : HTTP POST {IP}:{PORT}/rest/external/http Daten: UTF-8 kodiertes JSON als Body eines HTTP POST Aufrufs Return-Werte: Es werden die Standard-HTTP-Return-Codes verwendet. Außerdem wird ein JSON Objekt zurück geliefert. HTTP Code Bedeutung: 200 Alarm erfolgreich übergeben 400 Der Aufruf war fehlerhaft habe noch nicht mit der idHTTP Komponente gearbeitet :-( wie baue ich eine Verbindung zum Server auf? wie bewkomme ich die Antwort vom Server "Request" ausgewertet? brauch mal ein einfaches Beispiel um reinzukommen.
Delphi-Quellcode:
idHTTP1.Post('{IP}:{PORT}/rest/external/http', // das wird wohl nicht reichen :-)
|
AW: Datenübertragung via HTTP POST
Hallo lucy,
ich denke du benutzt eine Rest Service und möchtest mit diesem kommunizieren. Diesen selbst zu erstellen mit Indy und anzusprechen würde auch gehen, aber ich denke es wäre für dich einfacher einer Rest Client zu erstellen. Ich habe Dir dazu mal ein Beispiel von Embarcadero raus gesucht in dem dies gemacht wird. ![]() Vllt. hilft Dir dies ja schon weiter. Viele Grüße Jan |
AW: Datenübertragung via HTTP POST
Ich benutze TSslHttpRest von ICS. Den finde ich wesentlich komfortabler.
Hier ein Paar Snippets um dich auf den Weg zu bringen:
Code:
Das ganze dann noch in ein try/except packen.
bodystring:='{"key":"value"}'
url:='https://example.com/api/v1/endpoint'; httpwork.RcvdStream := TStringStream.Create('',TEncoding.UTF8); httpwork.RestRequest(httpPost,url,false,bodystring); httpresultstring := httpwork.responseraw; httpresultstring kannst du dann dem Statuscode gemäß verarbeiten.
Code:
case httpwork.StatusCode of
200: //verarbeiten 400: //Fehler, aber vielleicht steht im Bodystring was dazu else //alle anderen Fehler end; |
AW: Datenübertragung via HTTP POST
Ein Beispiel, wie mit Indy ein Json Dokument gesendet und die Antwort ausgegeben wird habe ich hier erstellt:
![]() Code:
Delphi-Quellcode:
program JSONPostExample;
{$APPTYPE CONSOLE} uses IdHTTP, IdGlobal, SysUtils, Classes; var HTTP: TIdHTTP; RequestBody: TStream; ResponseBody: string; begin HTTP := TIdHTTP.Create; try try RequestBody := TStringStream.Create('{"日本語":42}', TEncoding.UTF8); try HTTP.Request.Accept := 'application/json'; HTTP.Request.ContentType := 'application/json'; ResponseBody := HTTP.Post('https://httpbin.org/post', RequestBody); WriteLn(ResponseBody); WriteLn(HTTP.ResponseText); finally RequestBody.Free; end; except on E: EIdHTTPProtocolException do begin WriteLn(E.Message); WriteLn(E.ErrorMessage); end; on E: Exception do begin WriteLn(E.Message); end; end; finally HTTP.Free; end; ReadLn; ReportMemoryLeaksOnShutdown := True; end. |
AW: Datenübertragung via HTTP POST
Zitat:
der Code sieht sehr komplex aus! kannst du mir was zu den einzelnen zeilen erzählen? möchte diesen Code auch verstehen. deshalbt wollte ich erstmal nur mit einer "Verbindung" + "Request vom Server" anfangen. danke |
AW: Datenübertragung via HTTP POST
suche noch ein einfaches Beispiel :roll:
dieser quellcode funktioniert so leider nicht. hier die Beschreibung: ![]()
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var lParamList: TStringList; begin lParamList := TStringList.Create; lParamList.Add('message:test message'); lParamList.Add('type:TEST'); lParamList.Add('sender:self'); lParamList.Add('timestamp:1424950740000'); try memo1.Lines.Text := idHTTP1.Post('http://192.168.0.5/rest/external/http', lParamList); finally lParamList.Free; end; end; |
AW: Datenübertragung via HTTP POST
Und so?
Delphi-Quellcode:
Wenn das geht, ist der Aufbau des JSON-Objekts schon einmal korrekt, aber das sollte man nicht so machen, sondern besser eine "richtige" Bibliothek dafür nehmen.
lParamList := TStringList.Create;
lParamList.Add('{'); lParamList.Add('"message":"test message",'); lParamList.Add('"type":"TEST",'); lParamList.Add('"sender":"self",'); lParamList.Add('"timestamp":"1424950740000"'); lParamList.Add('}'); |
AW: Datenübertragung via HTTP POST
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
var
lParamList: TStringList; begin lParamList := TStringList.Create; lParamList.Add('{'); lParamList.Add('"message":"test message",'); lParamList.Add('"type":"TEST",'); lParamList.Add('"sender":"self",'); lParamList.Add('"timestamp":"1424950740000"'); lParamList.Add('}'); try |
AW: Datenübertragung via HTTP POST
Was steht denn in Zeile 66?
|
AW: Datenübertragung via HTTP POST
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
es kommt keine Fehlermeldung mehr! trotzdem ohne Funktion :-( |
AW: Datenübertragung via HTTP POST
Dann hast Du wohl einen Fehler in Deinem Code. Da wir den aber nicht kennen, können wir auch nicht sagen, wo genau.
|
AW: Datenübertragung via HTTP POST
Zitat:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var lParamList: TStringList; begin lParamList := TStringList.Create; lParamList.Add('{'); lParamList.Add('"message":"test message",'); lParamList.Add('"type":"TEST",'); lParamList.Add('"sender":"self",'); lParamList.Add('"timestamp":"1424950740000"'); lParamList.Add('}'); try memo1.Lines.Text := idHTTP1.Post('http://192.168.0.5/rest/external/http', lParamList); finally lParamList.Free; end; end; |
AW: Datenübertragung via HTTP POST
Sind denn die Parameter für Accept und Content-Type richtig gesetzt (siehe mjustins Beitrag)?
Delphi-Quellcode:
HTTP.Request.Accept := 'application/json';
HTTP.Request.ContentType := 'application/json'; |
AW: Datenübertragung via HTTP POST
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var lParamList: TStringList; begin lParamList := TStringList.Create('{"日本語":42}',TEncoding.UTF8); // Fehlermeldung lParamList.Add('{'); lParamList.Add('"message":"test message",'); lParamList.Add('"type":"TEST",'); lParamList.Add('"sender":"self",'); lParamList.Add('"timestamp":"1424950740000"'); lParamList.Add('}'); try idHTTP1.Request.Accept := 'application/json'; idHTTP1.Request.ContentType := 'application/json'; memo1.Lines.Text := idHTTP1.Post('http://192.168.0.5/rest/external/http', lParamList); finally lParamList.Free; end; end; |
AW: Datenübertragung via HTTP POST
Mal tust Du zu wenig, mal zuviel. Wenn schon, dann mit einem TStringStream statt einer TStringList.
Delphi-Quellcode:
var
lParamList: TStringStream; begin lParamList := TStringStream.Create('',TEncoding.UTF8); // Fehlermeldung sollte jetzt verschwinden lParamList.WriteString('{'); lParamList.WriteString('"message":"test message",'); lParamList.WriteString('"type":"TEST",'); lParamList.WriteString('"sender":"self",'); lParamList.WriteString('"timestamp":"1424950740000"'); lParamList.WriteString('}'); try idHTTP1.Request.Accept := 'application/json'; idHTTP1.Request.ContentType := 'application/json'; memo1.Lines.Text := idHTTP1.Post('http://192.168.0.5/rest/external/http', lParamList); finally lParamList.Free; end; |
AW: Datenübertragung via HTTP POST
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
AW: Datenübertragung via HTTP POST
Du solltest das JSON-Objekt nicht händisch zusammenbasteln wie im Beispiel, sondern eine Bibliothek dafür verwenden. Ich weiß nicht mehr, ob es System.JSON unter XE7 bereits gab, aber alternativ kannst Du ja einmal nach SuperObject googlen.
|
AW: Datenübertragung via HTTP POST
Zitat:
|
AW: Datenübertragung via HTTP POST
|
AW: Datenübertragung via HTTP POST
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
teste gerade noch ein wenig, habe hier noch einen Fehler! verstehe ich nicht ??
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var ParamList : TStringStream; begin ParamList := TStringStream.Create('', TEncoding.UTF8); ParamList.WriteString('{'); ParamList.WriteString('"message":"test message",'); ParamList.WriteString('"type":"ALARM",'); ParamList.WriteString('"sender":"192.168.0.217",'); ParamList.WriteString('"timestamp":"1424950740000",'); ParamList.WriteString('"data":{"address": "'(Edit1.Text)'"}'); //pas(49) ist doch gesetzt! // oder muss ich noch ein strtoint(Edit1.Text) setzen ParamList.WriteString('}'); try idHTTP1.Request.Accept := 'application/json'; idHTTP1.Request.ContentType := 'application/json'; memo1.Lines.Text := idHTTP1.Post('http://192.168.0.5/rest/external/http', ParamList); finally ParamList.Free; end; end; |
AW: Datenübertragung via HTTP POST
Delphi-Quellcode:
.. so könnte es passen.
ParamList.WriteString('"data":{"address": "'+Edit1.Text+'"}');
Grüße Klaus |
AW: Datenübertragung via HTTP POST
Tu dir aber selbst einen gefallen und nutze die JSON Frameworks die es schon gibt. Es ist natürlich gut zu verstehen was läuft und wie etwas aufgebaut ist, aber im fertigen Code würde ich immer auf das gehen, was man danach besser versteht bzw. weitere Verbreitung hat. Dein Code würde mit der system.JSON unit umgesetzt so aussehen.
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var myJSONObj: TJSONObject; myDataObj: TJSONObject; begin myJSONObj := TJSONObject.Create; try myJSONObj.AddPair('message', 'test message'); myJSONObj.AddPair('type', 'ALARM'); myJSONObj.AddPair('sender', '192.168.0.217'); myJSONObj.AddPair('timestamp', '1424950740000'); myJSONObj.AddPair('sender', '192.168.0.217'); myDataObj := TJSONObject.Create; myDataObj.AddPair('address', Edit1.text); myJSONObj.AddPair('data', myDataObj); try IdHTTP1.Request.Accept := 'application/json'; IdHTTP1.Request.ContentType := 'application/json'; Memo1.Lines.text := IdHTTP1.Post('http://192.168.0.5/rest/external/http', myJSONObj.ToJSON); except on e: Exception do ShowMessage('Huch, was ist denn da passiert? - ' + e.Message); end finally myJSONObj.free; end; end; |
AW: Datenübertragung via HTTP POST
Sicher, dass es nicht knallt, wenn Du ein "Kind-JSONObjekt" selbst freigibst?
|
AW: Datenübertragung via HTTP POST
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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 by Thomas Breitkreuz