Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Datenübertragung via HTTP POST (https://www.delphipraxis.net/211894-datenuebertragung-via-http-post.html)

lucy 18. Nov 2022 08:26

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 :-)

itblumi 18. Nov 2022 08:44

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.
https://docwiki.embarcadero.com/RADS...d_Web_Services

Vllt. hilft Dir dies ja schon weiter.

Viele Grüße
Jan

omnibrain 18. Nov 2022 09:14

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:
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;
Das ganze dann noch in ein try/except packen.
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;

mjustin 18. Nov 2022 09:19

AW: Datenübertragung via HTTP POST
 
Ein Beispiel, wie mit Indy ein Json Dokument gesendet und die Antwort ausgegeben wird habe ich hier erstellt:

https://mikejustin.wordpress.com/201...-6-https-post/


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.

lucy 20. Nov 2022 11:17

AW: Datenübertragung via HTTP POST
 
Zitat:

Ein Beispiel, wie mit Indy ein Json Dokument gesendet und die Antwort ausgegeben wird habe ich hier erstellt:

https://mikejustin.wordpress.com/201...-6-https-post/
vielen lieben Dank für Deine Hilfe :-)

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

lucy 21. Nov 2022 08:56

AW: Datenübertragung via HTTP POST
 
suche noch ein einfaches Beispiel :roll:
dieser quellcode funktioniert so leider nicht.

hier die Beschreibung:
https://alamos-support.atlassian.net...+Schnittstelle

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;

DeddyH 21. Nov 2022 09:35

AW: Datenübertragung via HTTP POST
 
Und so?
Delphi-Quellcode:
lParamList := TStringList.Create;
  lParamList.Add('{');
  lParamList.Add('"message":"test message",');
  lParamList.Add('"type":"TEST",');
  lParamList.Add('"sender":"self",');
  lParamList.Add('"timestamp":"1424950740000"');
  lParamList.Add('}');
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.

lucy 21. Nov 2022 09:52

AW: Datenübertragung via HTTP POST
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

und so?
geht nicht :-(

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

DeddyH 21. Nov 2022 11:32

AW: Datenübertragung via HTTP POST
 
Was steht denn in Zeile 66?

lucy 21. Nov 2022 12:09

AW: Datenübertragung via HTTP POST
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Was steht denn in Zeile 66?
Sorry, die Fehlermeldung gehört nicht zum Projekt :oops:

es kommt keine Fehlermeldung mehr! trotzdem ohne Funktion :-(

DeddyH 21. Nov 2022 12:15

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.

lucy 21. Nov 2022 12:19

AW: Datenübertragung via HTTP POST
 
Zitat:

Dann hast Du wohl einen Fehler in Deinem Code. Da wir den aber nicht kennen, können wir auch nicht sagen, wo genau.
der Code ist doch bekannt : :-)

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;

DeddyH 21. Nov 2022 13:31

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';

lucy 21. Nov 2022 13:59

AW: Datenübertragung via HTTP POST
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Sind denn die Parameter für Accept und Content-Type richtig gesetzt (siehe mjustins Beitrag)?
nein hatte ich nicht.

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;

DeddyH 21. Nov 2022 14:48

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;

lucy 21. Nov 2022 15:27

AW: Datenübertragung via HTTP POST
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Mal tust Du zu wenig, mal zuviel. Wenn schon, dann mit einem TStringStream statt einer TStringList.
Ja :oops: jetzt geht es! danke

DeddyH 21. Nov 2022 15:38

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.

lucy 22. Nov 2022 06:16

AW: Datenübertragung via HTTP POST
 
Zitat:

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.
würde mich schon interessieren! habe aber leider noch nichts brauchbares gefunden.

DeddyH 22. Nov 2022 07:27

AW: Datenübertragung via HTTP POST
 
SuperObject
System.JSON (gab es wohl bereits unter XE7)

lucy 22. Nov 2022 08:38

AW: Datenübertragung via HTTP POST
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

SuperObject
System.JSON (gab es wohl bereits unter XE7)
danke :-) schaue ich mir an!

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;

Klaus01 22. Nov 2022 08:52

AW: Datenübertragung via HTTP POST
 
Delphi-Quellcode:
ParamList.WriteString('"data":{"address": "'+Edit1.Text+'"}');
.. so könnte es passen.

Grüße
Klaus

fisipjm 22. Nov 2022 14:22

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;

DeddyH 22. Nov 2022 14:54

AW: Datenübertragung via HTTP POST
 
Sicher, dass es nicht knallt, wenn Du ein "Kind-JSONObjekt" selbst freigibst?

fisipjm 22. Nov 2022 15:05

AW: Datenübertragung via HTTP POST
 
Zitat:

Zitat von DeddyH (Beitrag 1515196)
Sicher, dass es nicht knallt, wenn Du ein "Kind-JSONObjekt" selbst freigibst?

Absolut richtig, habs korrigiert. Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 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