Beispiel RestAPI

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

Re: Beispiel RestAPI

Beitrag von epos »

Da gibt es eine exeption. Die Meldung innerhalb der IDE ist im Anhang.

Wenn das Programm "nomal", also mit DoppleKlick auf die EXE gestartet wird, ist "Access violation" angezeigt.
Dateianhänge
exeption01.jpg
exeption01.jpg (12.06 KiB) 4404 mal betrachtet

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Beispiel RestAPI

Beitrag von Warf »

epos hat geschrieben:Da gibt es eine exeption. Die Meldung innerhalb der IDE ist im Anhang.

Wenn das Programm "nomal", also mit DoppleKlick auf die EXE gestartet wird, ist "Access violation" angezeigt.


Ja hab grad mal nachgeschaut, hab mich vertan, man muss selbst eine Stream klasse bereitstellen. Die angepasste version wäre also:

Code: Alles auswählen

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

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

Re: Beispiel RestAPI

Beitrag von epos »

Vielen Dank warf.
Es klappt. Ich erhalte ein Access-Token.

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

Re: Beispiel RestAPI

Beitrag von epos »

Hallo zusammen ich habe da noch Verständnisprobleme und komme nicht weiter. Vielleicht habt ihr einige Codebeispiele.

Die Abmeldung

Der mit dem Request übergebene Access-Token wird vom System abgemeldet.
URL: https://api.xxxxx.de/api/v2/logout

Es werden wohl keine Daten oder das Access-Token übergeben und es erfolgt keine Rückmeldung.



Und dann der Zugang zur Abfrage. Muss jedes Mal vorher das Access-Token gesendet werden?

Bei allen Requests, mit Ausnahme des Login, wird der Zugang über den Access-Token authentifiziert, der auf zwei Wegen übergeben werden kann:

Erster Weg HTTP Authorization Header mit Wert “Bearer“ gefolgt vom Access-Token:

https://api.xxxxx.de/api/v2/product/29e ... 48c75af64f

Antwort Header
Connection close
Content-Type Application/json; charset=UTF-8
Date xxx yyyy zzz usw
Transfer encoding chunked

Anfrage Header
Accept application/jsonm text/javascript, */’; q=0.01
Accept –Encoding gzip, deflate
Accepz-Language de, en-US;q=0.7, en;q=0.3
Autorisation Bearer 123avf67-3355-6421-usw



Zweiter Weg URL Parameter access_token:

https://api.xxxxx.de/api/v2/logout?acce ... fe7700bd79

Bei nicht erfolgreicher Authentifizierung wird ein http-Statuscode 401 im JSON-Format zurückgegeben:
{
"error": "invalid_token",
"error_description": "Invalid access token: 98592fc6-61e6-4ed2-8f9e-f3fe7700bd79"
}


Und dann ist da die Abfrage an die URL.

URL: https://api.xxxxx.de/api/v2/products?page%3D<pageno>%26size%3D<size>%26[sort%3D<column>%26direction%3D<direction>][%26search%3D<value>][%26active%3D<active>][&26source%3D<source>]
Protokoll: HTTPS
Method: POST
Authentifizierung erforderlich: Ja

Wie erhalte ich die Ergebnisse der Abfrage?

Die Kommunikation mit der Schnittstelle ist mir noch nicht klar.

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

Re: Beispiel RestAPI

Beitrag von epos »

Keine Hilfe in Sicht?

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

Re: Beispiel RestAPI

Beitrag von theo »

Vielleicht hilft der Hinweis, dass der oben bereits erwähnte Lazarus JSON Viewer nun auch einen REST Tester eingebaut hat.
Erreichbar unter dem letzten Button in der Leiste (neben Mülleimer).
Dateianhänge
laz_rest.png
laz_rest.png (61.5 KiB) 3854 mal betrachtet

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

Re: Beispiel RestAPI

Beitrag von epos »

Danke @theo soweit bin ich noch nicht. Ich stehe da ganz am Anfang.

z.B. hab ich das Login mit dem code von Warf hinbekommen. Die function liefert ein token.

Nun war mein nächster Versuch mit dem Logout:

function Logout(User: String; Pass: String; accessToken: string): String;
var client: TFPHTTPClient;
json: string;
Req: TStringStream;
begin
json := '{"username": "%s", "password": "%s"}'.Format([User, Pass]);

client := TFPHTTPClient.Create(nil);
Req := TStringStream.Create(json);
try
client.AddHeader('Content-Type', 'application/json');
client.RequestBody := Req;

Result := client.Post('https://api.xxx.de/api/v2/logout');

// ShowMessage ('client.ResponseStatusCode: ' + IntToStr(client.ResponseStatusCode));

if client.ResponseStatusCode <> 200 then
raise ELoginFailedException.Create('Wrong logout data'+ #13#13 + 'client.ResponseStatusCode: ' + IntToStr(client.ResponseStatusCode))
finally
client.Free;
Req.Free;
end;
end;

Da erhalte ich die Meldung:

Wrong logout Data

client.ResponseStatuscode: 401

Die function scheint ja schon richtig zu sein nur die passwortübergabe oder die tokenübergabe ist so nicht richtig.

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

Re: Beispiel RestAPI

Beitrag von epos »

Wie sieht eine Datenstruktur oder function aus, wenn ich folgende Daten auslesen möchte?

"contributors":[{"type":"A01","firstName":"Jason","lastName":"Dark","groupName":null},{"type":"E07","firstName":"Frank","lastName":"Glaubrecht","groupName":null},{"type":"E07","firstName":"Joachim","lastName":"Kerzel","groupName":null},{"type":"E07","firstName":"Franziska","lastName":"Pigulla","groupName":null},{"type":"E07","firstName":"Joachim","lastName":"Kerzel","groupName":null},{"type":"E07","firstName":"Frank","lastName":"Glaubrecht","groupName":null},{"type":"E07","firstName":"Martin","lastName":"May","groupName":null},{"type":"E07","firstName":"Vittorio","lastName":"Alfieri","groupName":null},{"type":"E07","firstName":"Nicolas","lastName":"Böll","groupName":null},{"type":"E07","firstName":"Frank","lastName":"Glaubrecht","groupName":null},{"type":"E07","firstName":"Martin","lastName":"May","groupName":null},{"type":"E07","firstName":"Vittorio","lastName":"Alfieri","groupName":null},{"type":"E07","firstName":"Nicolas","lastName":"Böll","groupName":null},{"type":"E07","firstName":"Frank","lastName":"Glaubrecht","groupName":null},{"type":"E07","firstName":"Martin","lastName":"May","groupName":null},{"type":"E07","firstName":"Vittorio","lastName":"Alfieri","groupName":null},{"type":"E07","firstName":"Nicolas","lastName":"Böll","groupName":null},{"type":"E07","firstName":"Frank","lastName":"Glaubrecht","groupName":null},{"type":"E07","firstName":"Martin","lastName":"May","groupName":null},{"type":"E07","firstName":"Vittorio","lastName":"Alfieri","groupName":null},{"type":"E07","firstName":"Nicolas","lastName":"Böll","groupName":null}],

Vielen Dank!

Antworten