Results 1 to 9 of 9

Thread: REST server en parameters

  1. #1

    REST server en parameters

    Vraag, kan iemand mij eens (en voor altijd) uitleggen hoe het nu zit met parameters die je doorgeeft aan een REST service.

    Uitgaande van de Datasnap REST Application, waarbij standaard 2 methods geimplementeerd worden (ReverseString en EchoString) heb ik een REST Server gemaakt die gegevens uit een database beschikbaar moet stellen. Ik heb echt wel wat geprobeerd en ook echt wel de documentatie gelezen, maar ik krijg het niet voor elkaar wat gevraagd wordt.

    En dat is hetvolgende. Ik heb een method CustomerFetchList, en die vraagt een tweetal parameters, count en offset. Het resultaat is een JSON-array met klantgegevens. Nu vraagt mijn opdrachtgever dat die methode aangeroepen moet worden vanuit een browser via ../api/CustomerFetchList?count=208&offset=100.

    Echter, ik krijg het alleen werkend op de Delphi (?) manier ../api/CustomerFetchList/208/100

    Inderdaad, ik snap het niet. Mocht je het uit willen leggen, heeeeeeel graag en alvast hartelijk dank !

  2. #2
    Counting your refs
    Join Date
    Feb 2002
    Location
    Lage Zwaluwe
    Posts
    2,112
    REST is geen wetboek, maar het is wel de -gewoonte- om in REST api's offset en count als query parameters mee te geven (dus de count=X&offset=Y notatie) omdat het "meta" parameters zijn die de resultset van de GET call beperken. Hetzelfde geldt voor sortering en filtering.

    De essentie is dat de GET call zonder die parameters dezelfde betekenis heeft, al zal je om performance redenen de aanroep zonder count wellicht willen blokkeren.

    Uiteindelijk doet het er bij een API natuurlijk vooral toe dat de partijen goed met elkaar kunnen praten, en niet wie er gelijk heeft. Dat klinkt flauw, maar er komt in de dialoog rondom de ontwikkeling van een API altijd wel een momentje voorbij dat het goed is om dat even aan te stippen.

  3. #3
    Counting your refs
    Join Date
    Feb 2002
    Location
    Lage Zwaluwe
    Posts
    2,112
    Praktisch, als je met Datasnap niet anders kan dan je nu doet (ik neem dat direct aan, ik heb geen Datasnap kennis), en je host je service onder IIS, kun je dan misschien URL Rewrite op IIS inregelen om het gevraagde formaat om te zetten naar het door Datasnap vereiste /[count]/[offset] formaat?

    Ik weet niet op welk punt de Datasnap ISAPI DLL (ik gok een techniek hier) inhaakt op 't request, hopelijk is dat NA 't URL Rewrite mechanisme.

  4. #4
    Hi Paul-Jan, dank je wel voor je reactie, maar mijn vraag is dus eigenlijk, hoe krijg ik het voor elkaar dat mijn REST Server de query parameters (dus de count=X&offset=Y notatie) accepteert. dat ik die in mijn methods ook kan oppakken en daar mijn server-side ding mee kan doen ...

  5. #5
    Quote Originally Posted by Paul-Jan View Post
    Praktisch, als je met Datasnap niet anders kan dan je nu doet (ik neem dat direct aan, ik heb geen Datasnap kennis), en je host je service onder IIS, kun je dan misschien URL Rewrite op IIS inregelen om het gevraagde formaat om te zetten naar het door Datasnap vereiste /[count]/[offset] formaat?

    Ik weet niet op welk punt de Datasnap ISAPI DLL (ik gok een techniek hier) inhaakt op 't request, hopelijk is dat NA 't URL Rewrite mechanisme.
    Ik doe niets met IIS, het is een Datasnap REST Server application ...

  6. #6
    Counting your refs
    Join Date
    Feb 2002
    Location
    Lage Zwaluwe
    Posts
    2,112
    Ah, dat beperkt dan de mogelijkheden nogal (m'n eerste hit op datasnap REST server was het embarcadero artikel dat uitlegt hoe je 'm als ISAPI DLL onder IIS moet hosten, vandaar ).

    Als er verder geen schil omheen ligt dan ben je gebonden aan de mogelijkheden die Datasnap REST Server uit de doos biedt. Op het eerste gezicht zou ik zeggen:
    - Nee, het vertalen van query parameters (op de URL) naar method parameters (in de code) wordt niet ondersteund.
    - Je moet dus een method maken -zonder- parameters (wat verrassend goed overeen komt met m'n verhaal hierboven, het zijn immers geen gewone parameters maar meta)
    - In die method kun je dan via het Request object uit de TWebModule rechtstreeks bij de meegegeven query parameters. Code (ongeveer)

    Delphi Code:
    1. function TServerMethods1.MijnMethod: string;
    2. var
    3.    Module: TWebModule;
    4.    Count: Integer;
    5.    Offset: Integer;
    6. begin
    7.    Module := GetDataSnapWebModule;
    8.    Count = Module.Request.QueryFields['count'];
    9.    Offset = Module.Request.QueryFields['offset'];
    10.    // Doe iets
    11. end;

    Nou is het afwachten tot er een datasnapper langskomt om uit te leggen dat het wel gewoon kan, dat zou het mooist zijn natuurlijk.
    Last edited by Paul-Jan; 31-Mar-20 at 07:53.

  7. #7
    Senior Member
    Join Date
    Dec 2003
    Location
    Den Haag
    Posts
    197
    Hallo Frank,

    Een DataSnap REST Server Application bestaat in verschillende smaken. Bij het aanmaken van een DataSnap server binnen de Delphi IDE komt een wizard tevoorschijn, en ik neem aan dat je daar DataSnap REST Application hebt gekozen nietwaar? Op het volgende scherm kan je kiezen tussen verschillende typen zoals stand-alone, ISAPI of Apache. Ik begrijp dat je voor stand-alone hebt gekozen. Ook dit type heeft een WebModule unit, en zoals Paul-Jan al aangeeft, binnen servermethods is de webmodule gewoon te benaderen. Hoe heb je de DataSnap server gemaakt? Welke wizard, welk type? Laten we daar eerst eens mee beginnen. Welke Delphi versie?

  8. #8
    You could choose to use the free kbmMW Community Edition. It makes defining remotely accessible methods extremely easy.
    They can be accessed both from REST clients and native clients. It is all up to you.

    Example of a method accepting REST calls, including query parameters etc:

    Delphi Code:
    1. type
    2.   TYourRESTService = class(....)
    3.   public
    4.     [kbmMW_Rest('method:get, path: "/addnumbers"')]
    5.     function AddNumbers([kbmMW_Rest('value: "$arg1"')] const AValue1:integer;
    6.                          [kbmMW_Rest('value: "$arg2"')] const AValue2:integer):integer;
    7.   end;
    8. ...
    9. function TYourRESTService.AddNumbers(const AValue1,AValue2:integer):integer;
    10. begin
    11.      Result:=AValue1+AValue2;
    12. end;

    It can be called from a browser like this:

    http://.../addnumbers?arg1=10&arg2=20

    This is a simple example, but you can accept and return other datatypes including objects and lists, and you can easily define if it should accept JSON, XML and similarly if it should return JSON or XML.
    Further it is very easy to add Swagger (OpenAPI) support, so others easily can discover your REST service features and use them.

    A complete REST server with database support can be built in 5 minutes.

    More info: https://components4developers.blog/?s=REST

  9. #9
    Er is ook een boek "RESTfull services with Delphi" van Gordan Paunovic (Packt publishing) misschien dat je daar wat meer info kunt vinden.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •