Beispiel RestAPI

catweasel
Beiträge: 215
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 19.3 - (L 2.0.6 FPC 3.0.4)

Beispiel RestAPI

Beitrag von catweasel »

Hallo

Kennt jemand ein einfaches Beispiel um mit Lazarus via RestAPI Informationen aus einer Webseite auszulesen?

Alle meine Versuche mit httpsend von (ararat) synpase auch nur irgendetwas von https://jsonplaceholder.typicode.com/todos auszulesen
sind ohne den kleinsten Erfolg gescheitert. :cry:

Gruß
Michael

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2261
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Beispiel RestAPI

Beitrag von m.fuchs »

Hier: www.michael-fuchs.net/newsgroups/lazaru ... xample.zip

Ohne Synapse sondern mit dem FpHttpClient und auch nur schnell zusammengefriemelt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

catweasel
Beiträge: 215
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 19.3 - (L 2.0.6 FPC 3.0.4)

Re: Beispiel RestAPI

Beitrag von catweasel »

Danke für die Hilfe.
Allerdings habe ich hier noch Probleme beim compilieren in der Funktion ParseJson:

Code: Alles auswählen

function TForm1.ParseJson(const Json: String): TJSONArray;
begin
  with TJSONParser.Create(Json, [joUTF8]) do begin
    Result := Parse as TJSONArray;
    Free;
  end;
end;


Code: Alles auswählen

Projekt kompilieren, Ziel: JsonExample.exe: Exit code 1, Fehler: 3
unit1.pas(67,34) Error: Identifier not found "joUTF8"
unit1.pas(67,43) Error: Expression type must be class or record type, got <erroneous type>
unit1.pas(68,15) Error: Identifier not found "Parse"


Muß ich hier noch irgendeine Komponente installieren?

Gruß
Michael

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2261
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Beispiel RestAPI

Beitrag von m.fuchs »

Naja, wenn deine Signatur unten stimmt, dann solltest du mal auf ein aktuelles Lazarus updaten.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

catweasel
Beiträge: 215
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 19.3 - (L 2.0.6 FPC 3.0.4)

Re: Beispiel RestAPI

Beitrag von catweasel »

m.fuchs hat geschrieben:Naja, wenn deine Signatur unten stimmt, dann solltest du mal auf ein aktuelles Lazarus updaten.

Hatte ich auch kurz daran gedacht, aber da das bei Dir genauso ist, hatte ich den Gedanken wieder verworfen.

Dann schau ich mal nach einer neueren Version.
Ich hatte vor einiger Zeit schon mal versucht eine aktuelle Version zu installieren, was aber aus irgend einen Grund nicht funktioniert hat. Daraufhin bin ich wieder zur 1.6 gewechselt.

Gruß
Michael

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2261
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Beispiel RestAPI

Beitrag von m.fuchs »

catweasel hat geschrieben:
m.fuchs hat geschrieben:Naja, wenn deine Signatur unten stimmt, dann solltest du mal auf ein aktuelles Lazarus updaten.

Hatte ich auch kurz daran gedacht, aber da das bei Dir genauso ist, hatte ich den Gedanken wieder verworfen.

Mea culpa, hatte ich nicht aktualisiert.

Noch eine Idee: ersetz die Zeile mal durch

Code: Alles auswählen

with TJSONParser.Create(Json, True) do begin
dann sollte es auch mit 1.6 gehen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

catweasel
Beiträge: 215
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 19.3 - (L 2.0.6 FPC 3.0.4)

Re: Beispiel RestAPI

Beitrag von catweasel »

m.fuchs hat geschrieben:Noch eine Idee: ersetz die Zeile mal durch

Code: Alles auswählen

with TJSONParser.Create(Json, True) do begin
dann sollte es auch mit 1.6 gehen.

Super, so funktioniert es. :D
Ich hatte zwar zunächst Probleme, daß lag aber daran das diese Webseite mit den Testdaten im Internet liegt und hier über einen Proxy läuft.
Die "richtige" Seite die ich abfragen muß liegt im eigenen Netzwerk, ohne Proxy.

Danke und noch einen schönen Sonntag
Michael

Benutzeravatar
theo
Beiträge: 8328
Registriert: Mo 11. Sep 2006, 19:01

Re: Beispiel RestAPI

Beitrag von theo »

A propos JSON:
Ich möchte nochmal auf das viel zu unbekannte Tool JSON-Viewer hinweisen, welches sich in <laz>/tools/jsonviewer/ befindet.
Das ist wirklich praktisch, wenn man den Inhalt und Struktur einer JSON Datei anschauen möchte.
Bei mir ist das im System mit *.json verknüpft.


Bild

Mathias
Beiträge: 4899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Beispiel RestAPI

Beitrag von Mathias »

Ist JSON ein erweitertes, flexibleres Format von ursprünglich INI, später XML ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2261
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Beispiel RestAPI

Beitrag von m.fuchs »

What? Nein, die drei haben miteinander gar nichts zu tun.

INI ist ein textbasiertes Formet welches Schlüssel=Wert - Paare benutzt um die Daten zu speichern. Diese können in Sektionen gruppiert werden. Ein Baumstruktur ist nicht möglich.

XML ist kein Format sondern eine Auszeichnungs-(meta-)sprache. Das Ding ist ein wahres Monster von dem unzählige Formate wie RSS, SVG, GPX und so weiter ableiten.

JSON ist eigentlich eine Notation für Javascript-Objekte. Tatsächlich sollte jede gültige JSON-Datei gleichzeitig auch gültiges Javascript sein.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
theo
Beiträge: 8328
Registriert: Mo 11. Sep 2006, 19:01

Re: Beispiel RestAPI

Beitrag von theo »

Stimmt.
Mmn geht JSON aber schon ziemlich über Javascript hinaus, da es doch eine recht praktische und sparsame Art ist, hierarchische Daten bzw. Objekte zu "serialisieren".
Bevor ich das Rad neu erfinde, nehme ich dann auch gerne JSON, zumal ein Parser ja ziemlich überall (FPC, PHP...) zur Verfügung steht.

Mathias
Beiträge: 4899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Beispiel RestAPI

Beitrag von Mathias »

INI ist immer noch das einfachste, wen man einfache Konfigurations-Dateien braucht.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2261
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Beispiel RestAPI

Beitrag von m.fuchs »

Ja, das sollte jetzt keine Aussage sein, dass man JSON nur in Javascript verwenden sollte. Ich wollte nur die Herkunft der drei gegenüberstellen.

Tatsächlich ist für eine leichtgewichtige API selten etwas besser als JSON. Und auch als dateibasiertes Speicherformat ist es inzwischen unverzichtbar.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

epos
Beiträge: 7
Registriert: Mo 11. Nov 2019, 07:06

Re: Beispiel RestAPI

Beitrag von epos »

Guten Morgen!
Ich versuche mich gerade das erste mal an der RestAPI. Dazu nutze ich PHTTPClient. Jetzt möchte ich Zugriff auf einen RESTserver haben und das Access-Token erhalten. Wie übergebe ich User und PW nach folgender Beschreibung?

Der User wird eingeloggt und erhält einen gültigen Access-Token.
URL: Die Loginfunktionalität, mit dem die API das Access-Token generiert, wird über folgende URL/Funktion aufgerufen:
Live: https://api.xxxxx.de/api/v2/login
Protokoll: HTTPS
Method: POST
Authentifizierung erforderlich: Nein
Request Parameter:
Keine
Request Payload:
JSON mit den Attributen:
• username: your username
• password: your password
Beispiel: { "username": "your username", "password": "your password" }
Rückgabe:
HTTP-StatusCode: 200 Format: String Content: accessToken

Vielen Dank!

Warf
Beiträge: 1438
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Beispiel RestAPI

Beitrag von Warf »

epos hat geschrieben:Guten Morgen!
Ich versuche mich gerade das erste mal an der RestAPI. Dazu nutze ich PHTTPClient. Jetzt möchte ich Zugriff auf einen RESTserver haben und das Access-Token erhalten. Wie übergebe ich User und PW nach folgender Beschreibung?

Der User wird eingeloggt und erhält einen gültigen Access-Token.
URL: Die Loginfunktionalität, mit dem die API das Access-Token generiert, wird über folgende URL/Funktion aufgerufen:
Live: https://api.xxxxx.de/api/v2/login
Protokoll: HTTPS
Method: POST
Authentifizierung erforderlich: Nein
Request Parameter:
Keine
Request Payload:
JSON mit den Attributen:
• username: your username
• password: your password
Beispiel: { "username": "your username", "password": "your password" }
Rückgabe:
HTTP-StatusCode: 200 Format: String Content: accessToken

Vielen Dank!


Nicht getestet, müsste aber irgendwie so funktionieren:

Code: Alles auswählen

 
type
  ELoginFailedException = class(Exception);       
 
[...]
 
function Login(User: String; Pass: String): String;
var client: TFPHTTPClient;
  json: string;
begin
  client := TFPHTTPClient.Create(nil);
  try
    client.AddHeader('Content-Type', 'application/json');
    json := '{"username": "%s", "password": "%s"}'.Format([User, Pass]);
    client.RequestBody.Write(json[1], json.Length);
    Result := client.Post('https://api.xxxxx.de/api/v2/login');
    if client.ResponseStatusCode <> 200 then
      raise ELoginFailedException.Create('Wrong login data')
  finally
    client.Free;
  end;
end;

Antworten