Всем доброго дня! Продолжаю писать REST сервер, понадобилось делать красивые URL для API REST сервера, что-то в таком духе
1 |
/smsAPI/v1/TRegistrationMethods/AddProgram/ANewToken/ACheckToken |
1 |
/smsAPI/v1/TSendSMSMethods/SendSMS/APhone/AContent/ACheckToken |
Красиво? Мне тоже нравится.
Что у нас на входе?
Если собрать типичный REST сервер из мастера Delphi и запустить его. Пусть ну самый простой вариант. Standalone exe шник. Выглядит он так…
Ок, я тут немного подшаманил для своего проекта. Добавил ожидание СМС в секундах. Но суть простая – стандартная форма не сильно отличается. Если галки не снимали, по дефолту должно быть 2 метода в модуле TServerMethodsUnit
1 2 |
function EchoString(Value: string): string; function ReverseString(Value: string): string; |
Но это плохие методы в том смысле, что они недостаточно иллюстрируют как обращаться к параметрам из строки браузера. Я в свое время потратил пару часов, чтобы понять, если допустим 2 и больше параметров, то как обратиться в браузере? И вообще, есть у нас серверные методы в браузере – как к ним обратиться?
Как обращаться к REST серверному методу через браузер?
Да очень просто, пусть у нас есть метод в TServerMethodsUnit, скажем такой…
1 2 3 4 |
function AddProgram(ANewToken,ACheckToken:string ):string; // Добавление программы с определенным токеном // ANewToken - токен (GUID) добавляемой программы // ACheckToken - проверочный токен одного из администратора |
Сделайте ему любую реализацию. Здесь он просто для примера, пусть возвращает какую-то строку.
Запускаем наш EXE Rest сервера (жми на кнопку Start нашего EXE, дружище!).
В браузере пишем
1 |
http://localhost:8080/datasnap/rest/TServerMethods1/AddProgram/ANewToken/ACheckToken |
Видишь? Значение параметров пишем через слэш, в том порядке, в котором они объявлены в методе. Просто даже Марко Канту в своем монументальном труде не написал об этом))
Из-за таких мелочей и тормозим, но развиваемся зато как)))
Что получаем в ответ на запрос из браузера к нашему RestServer?
Ну что что. То, что запрограммировали, то и получаем. Только в формате JSON. Как разобрать ответ, можно посмотреть у меня в статьях тут и тут
Как изменить в URL слова datasnap/rest ?
Ok, тут прямо готовыми ссылками можно кидаться
Но если кратко – цитирую туториал Embarcadero! Идем в WebModule и меняем там в ObjectInspector свойства DSContext, RestContext, PathInfo
Customizing the URL for REST requests
You can easily customize parts of the URL for a REST request. You can change the standard DataSnap context from datasnap/ to mycontext/, for instance. Also, you can change the REST context from rest/ to myrest/, for instance. To do this:
- Switch to the WebModule of your DataSnap REST server application.
- Select the TDSHTTPWebDispatcher component.
- In the Object Inspector, locate the DSContext property.
- Change from datasnap/ to mycontext/ (or whatever you require). Remember to add the closing /.
- In the Object Inspector, locate the WebDispatch property and expand it.
- Update the PathInfo subproperty from datasnap* to mycontext*.
- In the Object Inspector, locate the RESTContext property.
- Change from rest/ to myrest/ (or whatever you require). Remember to add the closing /.
Как в URL добавить методы TServerMethods2 из другого модуля?
Ну скажем, чтобы было так
1 |
http://localhost:8080/datasnap/rest/TServerMethods1/AddProgram/ANewToken/ACheckToken |
И так
1 |
http://localhost:8080/datasnap/rest/TServerMethods2/AddProgram2/ANewToken/ACheckToken |
Вот до 5 утра сегодня не могло меня это отпустить! И вы знаете что? Вот в этой прекрасной статье написано, что серверные методы меняются так
1 2 3 4 5 |
procedure TServerContainer2.DSServerClass1GetClass( DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass); begin PersistentClass := ServerMethodsUnit2.TServerMethods2; end; |
Я сначала значит думаю, ну Ок, это метод компонента DSServerClass1, пробую менять на
1 2 3 4 5 |
procedure TServerContainer2.DSServerClass1GetClass( DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass); begin PersistentClass := ServerMethodsUnit.TServerMethods; end; |
И оно начинает работать в режиме или, то есть так
1 |
http://localhost:8080/datasnap/rest/TServerMethods1/AddProgram/ANewToken/ACheckToken |
или так
1 |
http://localhost:8080/datasnap/rest/TServerMethods2/AddProgram2/ANewToken/ACheckToken |
Короче, засыпаю уже, 5 утра! Думаю наесться перед сном да посмотреть Форсаж 8, и тут меня осеняет, когда я читаю вот это
В одном приложении-сервере DataSnap всегда присутствует один компонент «TDSServer», несколько транспортных компонентов, посредством которых «TDSServer» связывается с клиентами и несколькими компонентами «TDSServerClass». Этот компонент обеспечивает событие «OnGetClass», когда программист может задать класс серверного метода, экземпляр которого должен быть создан при поступлении запроса от клиента.
Екарный бабай, думаю я! Ну это ж надо! Всего-то добавить ещё 1 компонент DSServerClass!!!
Это просто потрясающе!!!
И вот что у нас получается! Оно начинает работать в режиме И.
Если все собрать и подшаманить, можно обращаться так…
1 |
/smsAPI/v1/TRegistrationMethods/AddProgram/ANewToken/ACheckToken |
1 |
/smsAPI/v1/TSendSMSMethods/SendSMS/APhone/AContent/ACheckToken |
Красиво? Мне тоже нравится! Спасибо, моему опытному заказчику!
Ну да, я тут переименовал TserverMethods1 в TRegistrationMethods – но это простое переименование класса во всех модулях, где он используется. Можно для этого использовать сочетание Ctrl+A прекрасной IDE Delphi, которая живет и развивается огромными темпами в 2017 году!
Что я слушал, пока писал этот пост?
Обоожаю Pink Floyd – это как машина времени!
Любви, здоровья, удачи