Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   REST request / Type not found (https://www.delphipraxis.net/202183-rest-request-type-not-found.html)

jsp 7. Okt 2019 08:43

REST request / Type not found
 
Guten Morgen!
Irgendwas übersehe ich da, oder mache grundsätzlich was falsch.

ich rufe einen REST-Request mit 'user' und 'passwort' auf, und erhalte folgendes Resultat:

Code:
{
    "payload": {
        "sessiontoken": "85955b90-b134-4c24-822a-28b23c12c57a"
    },
    "error": null,
    "retcode": 0
}
Scheint soweit zu passen. Der Token wird für alle anderen Requests als Authorisierung gebraucht.
Wenn ich nun aber folgende Funktion aufrufe (aus dem Manual):
Code:
      contextDataPositionsForChapter(
        UUID sessionID, /* Session ID */
        Integer chapter, /* Kapitel */
        String language, /* Sprache */
        Integer version, /* Version */
        Integer revision /* Kapitel-Stand */
      ): NPKPositionEcoData
Delphi-Quellcode:
function TfrmECO.contextDataPositionsForChapter(sessionID, chapter, version, revision : string): boolean;
var
  jsValue       : TJSONValue;
  jsRequest     : TJSONObject;
  jsDataStr     : string;

  jsStr : string;

  obj, data     : TJSONObject;
  retcode       : Integer;
  httpRes       : TStream;

begin
  Result := True;

  RESTClient1.BaseURL := 'https://contextdata.crb.ch/ctxdata/rest/1.0/published/eco/contextDataPositionsForChapter';
  RESTClient1.Params.Clear;
  RESTRequest1.ClearBody;

  jsRequest := TJSONObject.Create();

  jsRequest.AddPair(TJSONPair.Create('sessionID', TJSONString.Create(sessionID)));
  jsRequest.AddPair(TJSONPair.Create('chapter', TJSONNumber.Create(chapter)));
  jsRequest.AddPair(TJSONPair.Create('language', 'de'));
  jsRequest.AddPair(TJSONPair.Create('version', TJSONNumber.Create(version)));
  jsRequest.AddPair(TJSONPair.Create('revision', TJSONNumber.Create(revision)));

  RESTRequest1.AddBody(jsRequest);
  jsRequest.Free();

  RESTRequest1.Execute;
  jsValue:=RESTResponse1.JSONValue;

  obj := RESTResponse1.JSONValue as TJSONObject;

  jsStr := PrettyJSON(jsValue.ToString);
  SynEdit1.BeginUpdate;
  SynEdit1.Text := jsStr;
  SynEdit1.EndUpdate;
end;
Bekomme ich folgendes Resultat:
Code:
{
    "payload": null,
    "error": "Type not found",
    "retcode": 100
}
retcode 100
Fehler: der Kontextdaten-Typ wurde nicht gefunden bzw.
entspricht keinem Webservice-Pfad.

Hat jemand eine Idee was ich hier falsch mache?

Gruss, Jörn

DeddyH 7. Okt 2019 09:04

AW: REST request / Type not found
 
Funktioniert es denn, wenn Du die Daten z.B. mit Postman verschickst?

jsp 7. Okt 2019 09:10

AW: REST request / Type not found
 
Danke DeddyH

werde ich mal versuchen. Problem könnte sein, dass das Token als Cookie abgelegt ist, und
nur innerhalb der Session gültig ist.

Jörn

Uwe Raabe 7. Okt 2019 09:19

AW: REST request / Type not found
 
Stimmt denn die Art des Requests (GET/POST)?

jsp 7. Okt 2019 10:02

AW: REST request / Type not found
 
Die Request-Methode ist richtig ...

jsp 7. Okt 2019 10:26

AW: REST request / Type not found
 
Wenn ich mir eine URL zusammenzimmere, und dies in Browser kopiere

https://contextdata.crb.ch/ctxdata/r...a-832613807571

bekomme ich folgendes:

Code:
{
  "error": "Unauthorized",
  "payload": null,
  "retcode": 30
}
was nicht verwunderlich ist, da die sessionID (?a724cbc3-f7f0-4f98-827a-832613807571) im Browser nicht mehr gültig ist.

Was meint ihr zur Idee, es mal mit den Indys/TNetHTTPClient o.ä. zu versuchen?

Gruss, Jörn

Der schöne Günther 7. Okt 2019 10:30

AW: REST request / Type not found
 
Nur als kleiner Tipp: Unter Tools -> REST-Debugger macht so etwas in der Regel mehr Spaß als ständig neu zu kompilieren und "live" in der eigenen .exe zu testen.

jsp 7. Okt 2019 10:39

AW: REST request / Type not found
 
Danke für den Tipp. Habe ich schon rumgespielt.
Bisher habe ich's mit dem RESTDebugger nicht hinbekommen mich einzuloggen.
Die Funktion erwartet als einen der Parameter ein ziemlich umfangreiches xml
Innerhalb Delphi funktioniert dies soweit. Werde mich noch etwas mit dem RESTDebugger beschäftigen...

Gruss, Jörn

jsp 7. Okt 2019 13:37

AW: REST request / Type not found
 
So, die Lösung ist (für mich) gefunden. Mit den ganzen REST-klassen wollte es einfach nicht.
Habe mir nun eine Lösung mit TNetHTTPClient (URL+Query) gebastelt.
Funktioniert wie gewünscht.

Gruss, Jörn

Uwe Raabe 7. Okt 2019 15:02

AW: REST request / Type not found
 
Ich kann in deinem Code nicht sehen, wie der REST-Aufruf das SessionToken mitbekommt. In der Doku zu der API müsste ja irgendwo stehen, wo man das mitgeben muss (vermutlich als Header, aber welcher?). Überhaupt wäre ein Einblick in die API-Dokumentation hier recht hilfreich. Dann klappt das auch mit den REST-Klassen.

Ach ja, die verwendete Delphi-Version wäre auch von Interesse.

jsp 7. Okt 2019 15:34

AW: REST request / Type not found
 
Hallo Uwe

der SessionToken soll laut Doku als Query übergeben werden. Habe ich auch versucht, bin aber gescheitert.
Ich benutze 10.3.1 (werde mal mein Profil anpassen...)
Was ist an meiner Lösung mittels TNetHTTPClient falsch?

Jörn

Uwe Raabe 7. Okt 2019 22:19

AW: REST request / Type not found
 
Zitat:

Zitat von jsp (Beitrag 1449244)
der SessionToken soll laut Doku als Query übergeben werden. Habe ich auch versucht, bin aber gescheitert.

Wenn es sich bei dem Token um die SessionID handelt, dann ist die im Body falsch - eventuell gilt das auch für die anderen Parameter in jsRequest. Möglicherweise sollten die Parameter bei einem GET nicht im Body landen, sondern über RESTRequest1.AddParameter angegeben werden. Hier kann aber nud die API-Doku Erleuchtung bringen.

Wie sieht denn die komplette URL bei der Lösung mit TNetHTTPCLient aus?

Zitat:

Zitat von jsp (Beitrag 1449244)
Was ist an meiner Lösung mittels TNetHTTPClient falsch?

Gar nichts! Da wird genau wie bei RESTClient & Co auch ein THTTPClient verwendet. Allerdings bringen die REST-Komponenten halt schon eine ganze Menge REST-Funktionalität mit. Man muss halt nur wissen, wie man die nutzt.

jsp 8. Okt 2019 06:46

AW: REST request / Type not found
 
Danke für die bisherige Hilfe Uwe

die url sieht so aus:
Delphi-Quellcode:
urlStr := 'https://contextdata.crb.ch/ctxdata/rest/1.0/published/eco/contextDataPositionsForChapter/chapters/'+chapter+'/languages/de/versions/'+version+'/revisions/'+revision+'?sessiontoken='+sessionID;
Ich werde mal vorerst bei meiner Lösung bleiben, und mich, wenn etwas mehr Luft ist, mich mal in REST einarbeiten.
Fundiertes Grundwissen ist besser als grundiertes Fundwissen :roll:

Gruss, Jörn

Uwe Raabe 8. Okt 2019 21:11

AW: REST request / Type not found
 
Das sollte dann ungefähr so aussehen:
Delphi-Quellcode:
  RESTClient1.BaseURL := 'https://contextdata.crb.ch/ctxdata/rest/1.0/published/eco/';
  RESTRequest1.Resource := 'contextDataPositionsForChapter/chapters/{chapter}/languages/de/versions/{version}/revisions/{revision}';
  RESTRequest1.AddParameter('chapter', chapter, pkURLSEGMENT);
  RESTRequest1.AddParameter('version', version, pkURLSEGMENT);
  RESTRequest1.AddParameter('revision', revision, pkURLSEGMENT);
  RESTRequest1.AddParameter('sessiontoken', sessionID, pkQUERY);
  RESTRequest1.Execute;

jsp 9. Okt 2019 06:46

AW: REST request / Type not found
 
Danke Uwe

dein Snippet wird mir sicherlich auf die Sprünge helfen :bounce2:

Werde ich testen. Das mit den curly brackets innerhalb der Resource war mir nicht bekannt/bewusst.
Wie gesagt, ich muss mich da erst reinfuchsen.

Nochmals Danke!

Jörn

jsp 9. Okt 2019 07:04

AW: REST request / Type not found
 
Nachtrag...

hat wunderbar funktioniert :-D

Nochmals herzlichen Dank!


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