Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delphi XE2: How to define custom DataSnap REST URI?

I am using Delphi XE2 to write DataSnap REST service. I notice that the REST URI in DataSnap must strictly follow this format (refer here):

http://my.site.com/datasnap/rest/URIClassName/URIMethodName[/inputParameter]*

A famous example is sample method create by DataSnap server wizard:

http://my.site.com/datasnap/rest/TServerMethods1/ReverseString/ABC

There are 2 common ways to supply parameters in URI:

  1. Path Segment parameter: /TServerMethods1/ReverseString/ABC
  2. Query String parameter: /TServerMethods1/customers?name=bill

The Path Segment parameter URI is definitely supported by DataSnap REST. Is Query string parameters URI support in DataSnap REST too?

I have the following REST URI example and found it seems impossible to make it work with current DataSnap REST library:

  1. /customers/A1234

    return customer object of ID A1234

  2. /customers/A1234.xml

    return customer object of ID A1234 in XML format

  3. /customers/A1234.json

    return customer object of ID A1234 in json format

  4. /customers/A1234.html

    return customer object of ID A1234 in html format

  5. /customers?name=Bill

    return a list of customer whose name contain Bill

like image 644
Chau Chee Yang Avatar asked May 12 '12 09:05

Chau Chee Yang


2 Answers

I don't know how to do it using DataSnap, but there are ways around it. You can put something called URLRewrite to good use for this as both your friendly URI's and the ones required by DataSnap are easily mappable.

For IIS you can use (enable) the URLRewrite module which is standard in IIS 7. More information can be found on the official site: http://www.iis.net/download/urlrewrite.

Be sure to create rules for inbound and outbound URI's so that the "internal" (Datasnap) URI's do not get out into the wild.

If you are running the site on Apache, similar functionality is available, and I thin you need to amend the .htaccess file, but I have no experience with Apache so I could be wrong.

like image 167
Marjan Venema Avatar answered Nov 12 '22 15:11

Marjan Venema


A bit late to the party, but yes you can use query parameters.

You have to use GetInvocationMetadata.QueryParams

see the example below.

uses DBXPlatform;

function TServerMethods1.EchoString(Value: string): string;
var
  metaData: TDSInvocationMetadata;
  i: integer;
begin
  metaData := GetInvocationMetadata;
  for i := 0 to Pred(metaData.QueryParams.Count) do
  begin
    Result := Result + '<param>' + metaData.QueryParams[i] + '</param>';
  end;
  metaData.ResponseContent := '<xml>' + Result + '</xml>';
end;
like image 23
Patrick Avatar answered Nov 12 '22 14:11

Patrick