Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 REST в Ансамбле - че так сложно?  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3808
Каше 2017.2.1. Пытаюсь сделать http запрос к другому серверу, нужно json-объект отправить в теле запроса, запрос должен иметь Content-Type=application/json, простейшая задача.
Пытаюсь использовать операцию с EnsLib.HTTP.OutboundAdapter, и все превращается в BDSM. Нужно создать объект типа "поток", да еще не какой-нибудь, а такой, который имеет атрибуты, а их по разным пакетам распихан миллион, присвоить в этом потоке атрибут CONTENT-TYPE
d stream.SetAttribute("CONTENT-TYPE","application/json")
и отправит данные
s sc=..Adapter.Post(.httpResponse,,stream)
До того, что нужно установить атрибут - еще поди догадайся (мне пришлось смотреть исходники класса), вызов отправки тоже происходит неестественным образом.

Ну ладно, наверное, я дурак, и нужно использовать специально приспособленный класс EnsLib.REST.Operation, как это рекомендует документация. Смотрим, чем от отличается от Ens.BusinessOperation - дополнительно наследуется от Ens.Util.JSON, а там есть методы типа JSONStreamToObject. Наверное, он сразу сделает нам сразу нужный нам поток? А вот нифига. Мало того, что поток там без атрибутов, так он еще не понимает объекты типа %DynamicObject, потому что использует старый механизм %ZEN.Auxiliary.jsonProvider.

Еще есть EnsLib.REST.GenericOperation, но я ним я связываться не стал, хотя бы потому, что у него нет исходников и непонятно, что он делает.

Нет, я понимаю, с этим всем можно разобраться и у меня вроде бы получилось, но зачем, если через %Net.HttpRequest все делается гораздо проще и интуитивно понятнее? Я не верю, что все так деревянно, REST же не какая-то специфическая штука, сейчас половина сервисов на нем сделано, а Ансамбль - автоматизация более высокого уровня, чем разработка через %NetHttpRequest. Скажите, как вы делаете, может, я чего-то элементарного не понимаю?
6 окт 18, 19:49    [21697106]     Ответить | Цитировать Сообщить модератору
 Re: REST в Ансамбле - че так сложно?  [new]
eduard93
Member

Откуда:
Сообщений: 170
Блок А.Н., была такая же проблема решал через кастомный адаптер.
6 окт 18, 22:48    [21697162]     Ответить | Цитировать Сообщить модератору
 Re: REST в Ансамбле - че так сложно?  [new]
eduard93
Member

Откуда:
Сообщений: 170
Как пример написания адаптера к большому REST API могу предложить технологию Managed File Transfer которая предлагает доступ к облачным дискам Box, Kiteworks и DropBox.
В частности я дописал к ней адаптер для Яндекс.Диска.
В MFT предлагается следующая архитектура решения - потребителя REST API:
  • Адаптер разделяется на 2 класса: один делает http запросы и возвращает объекты, второй организует бизнес-логику
  • Все запросы отправляются одним методом, аргкменты которого - переменные в данном API, за счёт чего достигается унифицированность ответа
  • Класс бизнес-логики занят обработкой объекта-ответа
  • 6 окт 18, 22:58    [21697166]     Ответить | Цитировать Сообщить модератору
     Re: REST в Ансамбле - че так сложно?  [new]
    kolesov
    Member

    Откуда: Владивосток
    Сообщений: 794
    Блок А.Н.,
    а не проще сделать шлюзик для внешних json-запросов.
    У меня такой есть на php.
    Код простой, типа:

    	$curl=curl_init();
    
    	$data = $_POST["data"];
    	$serv = $_POST["serv"];
    	$path = $_POST["path"];
    
    	$headers[]='Host: '.$serv;
    	$headers[]='Content-Type: application/json';
    	$headers[]='Content-Length: '.strlen($data);
    
    	curl_setopt($curl, CURLOPT_URL, $serv.$path);
    	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    	curl_setopt($curl, CURLOPT_POST, 1);
    	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    	curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    
    	echo curl_exec($curl);
    


    Засылаем в него постом наш JSON - и забираем ответ.
    Плюс (м.б. и сомнительный) - шлюзик может лежать на амазоне и если нас решили забанить, то это ненадолго ;)
    11 окт 18, 02:47    [21701122]     Ответить | Цитировать Сообщить модератору
     Re: REST в Ансамбле - че так сложно?  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3808
    Мне кажется, такой базовый функционал должен все-таки делаться на уровне стандартных библиотек, и без таких вот неочевидных действий.
    11 окт 18, 17:57    [21701883]     Ответить | Цитировать Сообщить модератору
     Re: REST в Ансамбле - че так сложно?  [new]
    kalin
    Member

    Откуда:
    Сообщений: 313
    Блок А.Н.,
    Как Вам эта статья https://habr.com/ru/post/265845/ и что думает Intersystems по этому поводу ?
    19 фев 19, 16:35    [21814519]     Ответить | Цитировать Сообщить модератору
     Re: REST в Ансамбле - че так сложно?  [new]
    DAiMor
    Member

    Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow
    Сообщений: 2709
    kalin
    Блок А.Н.,
    Как Вам эта статья https://habr.com/ru/post/265845/ и что думает Intersystems по этому поводу ?
    Статья совершенно ни о чем. И думать InterSystems там не над чем.
    19 фев 19, 17:17    [21814598]     Ответить | Цитировать Сообщить модератору
     Re: REST в Ансамбле - че так сложно?  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3808
    kalin,

    Мне restful с его ресурсами, статусами и CRUD не близок. Мне ближе спихнуть кучу данных пост-запросом в JSON и получить кучу данных в ответ. А Интерсистемс, действительно, думать не о чем. Есть технология - они ее поддерживают. И уже дело наше, как ее использовать.
    19 фев 19, 19:14    [21814764]     Ответить | Цитировать Сообщить модератору
     Re: REST в Ансамбле - че так сложно?  [new]
    doublefint
    Member

    Откуда: Беларусь, Минск
    Сообщений: 945
    Блок А.Н.
    Мне ближе спихнуть кучу данных пост-запросом в JSON и получить кучу данных в ответ
    И где-то там, в класс-методе обработки ( впрочем, и на клиенте тоже ) "красиво" роутить вызовы других методов в зависимости от свойств прилетевшей кучи. Но понимаю, да. Сам так делал ;)
    4 мар 19, 12:45    [21824236]     Ответить | Цитировать Сообщить модератору
     Re: REST в Ансамбле - че так сложно?  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3808
    doublefint,

    А че их роутить? На каждый метод свой класс. Просто аргументом этого метода приходит не простой параметр, а дерево объектов json.
    4 мар 19, 18:54    [21824760]     Ответить | Цитировать Сообщить модератору
     Re: REST в Ансамбле - че так сложно?  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3808
    doublefint,

    Я имею в виду, что в restful же например для работы, например, с заявкой, будут разные методы типа
    PUT /order - создать заявку
    POST /order/NNN - редактировать заявку NNN
    GET /order/NNN - получить заявку

    Мне проще использовать
    GET /getorder?id=NNN
    POST /saveorder

    Потому что в моей практике не всегда операции к CRUD сводятся, там может быть каша всяких действий. Так зачем загонять себя в в эту идеологию ради идеологии?
    4 мар 19, 19:01    [21824766]     Ответить | Цитировать Сообщить модератору
     Re: REST в Ансамбле - че так сложно?  [new]
    doublefint
    Member

    Откуда: Беларусь, Минск
    Сообщений: 945
    Блок А.Н.
    там может быть каша всяких действий
    Вот этого, собственно, и рекомендуют избегать - K.I.S.S
    Блок А.Н.
    Мне проще использовать GET /getorder?id=NNN
    Проще, чем GET /order/NNN ?
    Блок А.Н.
    Так зачем загонять себя в в эту идеологию ради идеологии?
    Одним из недостатков считается отсутствие четкого стандарта ( например, PUT vs POST ). Зачем загоняться, можно придерживаться в нужной вам мере
    4 мар 19, 23:04    [21824887]     Ответить | Цитировать Сообщить модератору
     Re: REST в Ансамбле - че так сложно?  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3808
    doublefint,

    Каша из действий все равно где-то будет. Либо на клиенте, либо на сервере. И мне намного проще делать это на сервере.
    Так что я действительно стараюсь сделать проще - спихиваю данные на сервер :-)

    >Проще, чем GET /order/NNN ?
    В случае getorder не проще. А в случае makeхрензнаетчто просто адекватный путь придумать не получается. А названия пути - это как название метода, уже привычно.

    >Одним из недостатков считается отсутствие четкого стандарта ( например, PUT vs POST )
    А у RESTFUL есть стандарт? И что он дает?
    6 мар 19, 23:09    [21826827]     Ответить | Цитировать Сообщить модератору
     Re: REST в Ансамбле - че так сложно?  [new]
    doublefint
    Member

    Откуда: Беларусь, Минск
    Сообщений: 945
    Блок А.Н.
    Каша из действий все равно где-то будет. Либо на клиенте, либо на сервере.
    Так тренд на то, как я понимаю, чтобы делать это на клиенте. Мол, клиентов много и разных, на всех процессоров не найти, а клиенты пока ответа ждут - ничем не заняты. А так сервер предоставляет узкоспециализированный сервис, делает что-то одно, но быстро - см. микросервисы vs монолит

    > А в случае makeхрензнаетчто просто адекватный путь придумать не получается
    Ну make сделает на сервере что-то новое, значит уже POST /whateveryouwant, а дальше надо разбираться в разновидностях ХЗЧ из вашей предметной области

    > А у RESTFUL есть стандарт?
    "Одним из недостатков считается отсутствие четкого стандарта"
    И как следствие - практически невозможно автоматически сгенерировать клиент для выставленного REST API
    7 мар 19, 00:59    [21826867]     Ответить | Цитировать Сообщить модератору
    Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить