Перейти к содержанию
  • Регистрация
  • 0
Сергей Сергеев

DataSnap sever с сессией через REST клиент (php, js..)

Вопрос

Добрый всем день!

Уважаемые коллеги, столкнулись с такой проблемой.

Если есть DataSnap сервер, работающий в режиме Session, и клиент, написанный на Delphi с использованием TSqlConnection к серверу по протоколу DataSnap.

то все работает. Т.е. клиент открывает соединение,   вызывает методы сервера , при этом на сервере, в экземпляре класса ServerMethod ( живущий от Коннекта, до его закрытия) - хранятся все данные сессии, ИД клиента, его настройки и т.д., и закрыват соединение, при этом сервер уничтожает  экземпляр класса ServerMethod, со всеми данными.

Встал вопрос, как использовать этот же сервер, с другими клиентами, работающими по REST, например PHP, JS.

У DS сервера есть rest протокол, НО! после любого обращения по REST, сервер создает и уничтожает сразу класс ServerMethod ( т.е. работает в режиме LifiCicle = Invocation, о чем честно написано в документации)

Т.е. хранить данные подключения не получится.

Чтобы не переписывать сервер, решили попытаться прикинуться клиентом DS. Поставили между сервером DS и клиентом DS снифер. Выяснилось, что они общаются между собой по интерфейсу tunel.

т.е. вместо http://docwiki.embarcadero.com/RADStudio/Rio/en/DataSnap_REST_Messaging_Protocol

Цитата

http://host:port/datasnap/rest/[ClassName]/[MethodName]/[ParamValue]

надо обращаться на http://host:port/datasnap/tunnel/[ClassName]/[MethodName]/[ParamValue]

вообщем там целая жизнь из команд PUT, GET..  

Описания этого протока не нашел..

Может кто уже имел такой опыт по сопряжению REST клиента и DS сервера в режиме LifeCicle = Session.

В приложенном файле протоколе обмена 

- открытие соединения c с клиента , без авторизации  ( TSqConnect )

- выполнение метода LoginByKartVDevOsDOC с параметрами - внутренний логин в систему,

пс. а почему txt нельзя прикрепить?? пришлось зарарить.. 

 

 

protokol DataSnap.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

Одно из основных требований протокола REST - отсутствия состояния. Т.е. сервер ничего не должен хранить: запрос от клиента, ответ от сервера, все. Никаких сессий и прочей мути. 

То что у вас на данный момент реализовано - велосипедный костыль, поэтому никакие стандартные фреймворки с этим работать не будут. 

P.S. Прочитал ваше сообщение внимательнее - все верно у вас работает. 

"НО! после любого обращения по REST, сервер создает и уничтожает сразу класс ServerMethod" - вот так и должно быть.

Изменено пользователем Евгений Корепов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
10 часов назад, Евгений Корепов сказал:

НО! после любого обращения по REST, сервер создает и уничтожает сразу класс ServerMethod"

да, про это и написано в доках. Но при обращении на rest, в хедере, директиве Pragma=dss=ИД сессии , сервер возвращает ИД. Если слать ему ее обратно на сервер, то идет обмен все время с этим ИД. Т.Е сессия на Рест живет, Но ServerMethod уничтожается. Чего нет при обращении по tunnel ( вместо rest). Зачем ид сессии по рест, если сессии в ДС нет? явная недоделка, которую и хотел немного подправить - смоделировав обмен, как будто ДС клиент.

Фреймворки не смогут.. ну можно библиотечку для PHP, JS сделать.. и смогут..

Но, к сожалению. времени нет, описания протокола tunnel нет, решил переделать методы ДС сервера на открытые, т.е. все параметры в запросе.. а сессию пусть пхп-браузер в своих куках, переменных держат. Моя сторона только ДС сервер, задача сделать АПИ для других организаций.

Но если кто то раскопал про тунели.. буду рад любой информации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От Morfi
      Подскажите, пожалуйста, как реализовать серверный метод, который должен выдать TList<TMyObject> ?
      Имеется в виду, что бы на стороне клиента получилось бы так:
      var FResult: TList<TMyObject>; begin //... FResult := MyServerMethod; //Серверный метод, который возвращает TList<TMyObject> //... end;  
    • От Аров Марат (Coolmarat)
      Здравствуйте, коллеги.
      При написании клиента под андроид для Datasnap сервера столкнулся с проблемой, что из телефона строки с русскими буквами
      уходят в нечитаемом виде на сервер. При запуске приложения под Windows проблемы нет. Даже тестовые методы, генерируемые
      мастером создания DataSnap сервера (EchoString, ReverseString) не работают с русским текстом при запуске клиента на
      андроиде. Прилагаю тестовые проекты сервера и клиента с вызовом одной только функции ReverseString - у меня все равно
      выходят кракозябры. Помогите разобраться, как правильно передавать строки с русскими буквами.

      DSTestStrAndroidServer.zip
      DSTestStrAndroidClient.zip
    • От dim
      есть сервер DataSnap, если после подключения к нему клиента сервер выключит и включить снова то клиент выдает ошибку
      если отловив ее на клиенте делаю    
      SQLConnection1.Connected:= False; 
      SQLConnection1.Connected:= True;
      все равно не работает дальше, надо закрыть программу и снова открыть
      как избавится от этого?
      xe10.1
    • От Rionn
      В этой ссылке показан пример работы в одной сети (написано курсивом). Не могу найти, чтобы PC работал по сети или по WiFi, а телефон по мобильным данным. Не подскажете?
    • От Akromd
      Добрый вечер.
      Только начал изучать технологию Datasnap. Разобрался с простейшим сервером и клиентом, находясь в одной сети все прекрасно работает.
      Но сейчас ставлю перед собой задачу, что клиенту изначально неизвестен ip сервера, но знаем что он находится в одной сети. Сразу возникает мысль послать широковещательный пакет от клиента и при получении его сервером отправить ответ.
      Теперь вопрос, как послать такой пакет? Если кто то может подсказать где почитать про это и посмотреть примеры, буду очень признателен.
    • От Ufomaster
      У кого есть рабочий пример получения бинарного файла из дроб бокса ?  REST;  Текстовый принимает, а бинарный нет. Помогите. 
    • От FREEFAR
      Доброе время суток всем!
      Очень нужна помощь профессионалов, любителей и тех кто просто имеет опыт в этом деле. Пишу приложение под платформу Android и возникла потребность загружать фото на сервер приложений с устройств.  Все построено  на Datasnap.
      на клиенте    
      ImageStream := TMemoryStream.Create; image1.Bitmap.SaveToStream(ImageStream); FileName := taskf.TASKNUMBER+'_'+AnsiReplaceStr(AnsiReplaceStr(datetimetostr(now),'.',''),':',''); Bytes := ClientModule1.ServerMethods1Client.UploadImage(FileName,ImageStream); при вызове функции загрузки падает: no mapping for the unicode character exists
      Что интересно : если делать по http все проходит 
      только переключаю  на https не работает...
      А в требованиях СИБ сами знаете....
      Если кто знает в чем секрет, помогите пжл.
      Какая инфа нужна будет - предоставлю. 
      Заранее сорян за косоязычность - первый пост как никак
       
    • От notricky
      Возникает вышеозначенная ошибка при попытке декодировать приходящий от сервера текст.
      Я пробовал в различных вариантах.
      http://www.fmxexpress.com/secure-your-rest-client-with-ssl-and-gzip-compression-in-delphi-xe8-firemonkey-on-android-and-ios/
      http://www.fmxexpress.com/decode-gzip-content-from-the-rest-client-in-delphi-xe7-firemonkey-on-android-and-ios/  
       
      Я получаю либо  ошибку из названия темы, либо  Error on call to ZLib library function inflateInit2_

      В общем не работает только на iOS (iPhone).
      На Android, Windows, MacOS работает корректно декомпрессия в автоматическом режиме, потому вопроса о строках не возникает.
    • От notricky
      Собственно есть способ получать и распаковывать данные, полученные в GZIP.
      В качестве примера:
      procedure TFMain.FormCreate(Sender: TObject); begin (ReqGet.Client.HTTPClient.Peer.GetObject as TIdCustomHTTP).Compressor := TIdCompressorZLib.Create(ReqGet.Client.HTTPClient.Peer.GetObject as TIdCustomHTTP); ReqGet.AcceptEncoding := 'gzip,deflate'; ... end; А вот как их отправить (как запаковать - механизм? и куда подставить строку) - не понятно.
      Отправка интересует и POST и GET
      Прошу помощи.
    • От Равиль Зарипов (ZuBy)
      Доброго времени суток!
      Навеяно этой темой.
      Посмотрел реализацию от @Pax Beach (за что ему спасибо большое) и столкнулся с тем что TRESTClient со всеми потрахами это просто дикий ужас.
      Решил собрать аналогичный пример, только не использовать TREST***
      немного опишу, свою реализацию
      uAppSettings.pas - хранит описание вашего приложения созданного в ВК  FMX.RESTLight.pas - модуль "общения" клиента с сервером FMX.RESTLight.Types.pas - тут хранятся типы для работы TRESTLight Приведу код, который постит Вам на стену текст
      var aFields: TArray<TmyRestParam>; aJSON: string; begin SetLength(aFields, 5); aFields[0] := TmyRestParam.Create('access_token', FAuthToken.token, false); aFields[1] := TmyRestParam.Create('v', FVKApp.APIVersion, false); aFields[2] := TmyRestParam.Create('owner_id', FAuthToken.user_id, false); aFields[3] := TmyRestParam.Create('friends_only', '0', false); aFields[4] := TmyRestParam.Create('message', 'Тестовое сообщение <RESTLight>', false); TTask.Run( procedure begin aJSON := TRESTLight.Execute('wall.post', FVKApp, aFields); TThread.Synchronize(TThread.CurrentThread, procedure begin Memo1.Lines.Add('---- wall.post ----'); Memo1.Lines.Add(aJSON); end); end); а вот так можно заливать файлы
      var aFields: TArray<TmyRestParam>; aJSON: string; begin SetLength(aFields, 4); aFields[0] := TmyRestParam.Create('access_token', FAuthToken.token, false); aFields[1] := TmyRestParam.Create('v', FVKApp.APIVersion, false); aFields[2] := TmyRestParam.Create('owner_id', FAuthToken.user_id, false); aFields[3] := TmyRestParam.Create('photo', aUploadFile, true); // для файлов указывается !!!true!!! TTask.Run( procedure begin // для загрузки файлов использовать TRESTLight.Execute2, в нем можно указать произвольный URL aJSON := TRESTLight.Execute2(aUploadURL, FVKApp, aFields); TThread.Synchronize(TThread.CurrentThread, procedure begin Memo1.Lines.Add('---- upload file to server ----'); Memo1.Lines.Add(aJSON); end); end); P.S. На правильность и оригинальность не претендую, просто альтернативный вариант. Мне например не понравилась как устроен TRESTClient, много компонентов лишних. В боевых условиях наверное код еще будет модернизироваться, я рассмотрел только пару методов, но думаю общая концепция не сильно поменяется
      GitHub   TRESTLight.zip
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...