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

Откуда: Новосибирск
Сообщений: 3771
Каше 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

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

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

    Откуда: Владивосток
    Сообщений: 748
    Блок А.Н.,
    а не проще сделать шлюзик для внешних 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

    Откуда: Новосибирск
    Сообщений: 3771
    Мне кажется, такой базовый функционал должен все-таки делаться на уровне стандартных библиотек, и без таких вот неочевидных действий.
    11 окт 18, 17:57    [21701883]     Ответить | Цитировать Сообщить модератору
    Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить