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;