Delphi XE2: Как определить пользовательский идентификатор URI DataSnap?

Я использую Delphi XE2 для записи службы DataSnap REST. Я замечаю, что URI REST в DataSnap должен строго следовать этому формату (см. здесь):

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

Известный пример - это метод создания образца с помощью мастера сервера DataSnap:

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

Существует два распространенных способа подачи параметров в URI:

  • Параметр сегмента пути:/TServerMethods1/ReverseString/ABC
  • Параметр Query String:/TServerMethods1/customers? name = bill

Параметр URI параметра пути определен определенно поддерживается DataSnap REST. Поддерживается ли поддержка параметров URI строки в DataSnap REST?

У меня есть следующий пример URI REST и нашел невозможным заставить его работать с текущей библиотекой REST DataSnap:

  • /клиентов/A1234

    вернуть объект клиента ID A1234

  • /customers/A1234.xml

    вернуть объект клиента ID A1234 в формате XML

  • /customers/A1234.json

    вернуть объект клиента ID A1234 в формате json

  • /customers/A1234.html

    вернуть объект клиента ID A1234 в формате html

  • /клиенты? Имя = Bill

    возвращает список клиентов, чье имя содержит Билл

Ответ 1

Я не знаю, как это сделать с помощью DataSnap, но есть способы обойти это. Вы можете использовать для этого что-то названное URLRewrite, так как ваш дружественный URI и те, которые требуются DataSnap, легко отображаемы.

Для IIS вы можете использовать (включить) модуль URLRewrite, который является стандартным для IIS 7. Более подробную информацию можно найти на официальном сайте: http://www.iis.net/download/urlrewrite.

Обязательно создайте правила для входящих и outbound URI, чтобы "внутренний" (Datasnap) URI не выходил в дикую природу.

Если вы запускаете сайт на Apache, доступны аналогичные функции, и я хочу, чтобы вы изменили файл .htaccess, но у меня нет опыта работы с Apache, чтобы я мог ошибаться.

Ответ 2

Немного поздно для вечеринки, но да, вы можете использовать параметры запроса.

Вам нужно использовать GetInvocationMetadata.QueryParams

см. пример ниже.

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;