AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.06.2016, 18:18   #1  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
DAX2009, веб-сервисвозращает данные в виде "\u####"
Проблема следующая - с веб-сервисом обмениваюсь данными с помощью .net библиотек, всё идет нормально, до тех пор пока в ходе метода "GET" не получаю запрашиваемые данные. Конкретно, System.IO.StreamReader, метод readToEnd.
Возвращаемая строка приходит то ли в Unicode формате, то ли там в самом начале, в настройке в методах set_* я что-то не так задал, короче в инфологе или отладчике виден просто перечень вида "\u0410\u0431..." и т.д.
Есть какое-нибудь средство конвертации такой строки в понимаемый вид?
Пробовал играться с System.Text.Encoding::Convert, но ничего путного не вышло, если не считать что в одной из попыток вместо описанного выше текста вылезли кракозябры.
Наверно ведь это как-то лечится?

Порылся на форуме, вроде много чего-то похожего видел, но приведённые там решения не помогли, а по конкретно описанной проблеме ничего не нашёл.
Старый 27.06.2016, 18:59   #2  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
X++:
System.Web.HttpUtility::HtmlDecode("\u0410\u0431");
__________________
За это сообщение автора поблагодарили: gl00mie (2), alex55 (1), FrolovAndy (1).
Старый 28.06.2016, 10:42   #3  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Благодарю Вас, в точности то что надо!
Старый 28.06.2016, 16:38   #4  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Решил новую тему не создавать, спросить здесь же, ибо проблемы по тому же веб-сервису, с методом "GET" разобраться удалось, теперь ломаю голову над "POST".
Посмотрел все возможные примеры как отрабатывает - на разных приложениях, на форуме, всюду получается примерно следующая схема - создается request со своим url, после его настройки формируется streamWriter, в который передается еще какая-то информация, чаще всего некий xml, далее на нем вызывается Write(), после чего уже идет response и reader с текстом ответа.
Т.е. это так, как должно быть в большинстве случаев. Но в моем варианте, если верить мануалу по API, по той команде которую надо использовать, выходит что всё делается одним url-запросом, и тогда совсем уже непонятно как реализовать такое поведение в AX, что передавать в streamWriter, и нужен ли тогда вообще сам streamWriter. Пробовал без него обойтись - ничего не работает, выдается что ошибочный запрос. Пытался комбинировать - что-то запихивать в url при создании request, остальную часть в streamWriter, но это всё игра в угадайку, и ничего путного не выходит.
Короче, запутался окончательно, может есть в жизни какие-то похожие примеры использования "POST" в том виде как я выше описал? Или тут вообще надо подход менять коренным образом, другие механизмы использовать?
Старый 29.06.2016, 10:47   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
При работе с web-сервисом все и всегда все делают одним url-запросом. А все "танцы с бубном" вокруг streamWriter и streamReader- это все или подготовка этого самого url-запроса или разбор полученного ответа

Ну, чтобы было понятно, это как вызов метода с параметром. Можно сказать, что url - это "имя метода", а передаваемый XML - параметр. Точнее, если речь идет о POST, то универсальным параметром является некий "контейнер", а XML- это элемент этого контейнера
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Pustik (2), FrolovAndy (1).
Старый 29.06.2016, 14:00   #6  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Воистину! Огроменная благодарность!
На свежую голову попробовал по Вашему совету всё запихнуть в url, и без streamWriter, и всё получилось.
Почему вчера не получалось - так и не понял, наверно под вечер мозги закипели, и где-то подкосячил.
Старый 11.07.2016, 19:00   #7  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Теперь продолжение "приключений".
Всё вышесказанное хорошо работало до тех пор, пока не потребовалось работать с командами типа POST, требующими помимо запроса передачи структуры в формате JSON.
Т.е. есть примерно следующий контент:
{"cards":
[{"serial":"test1", "template":"TestFr"},
{"serial":"test2", "template":"TestFr"}]
}
и его надо как-то пропихнуть в Web-сервис.
Был бы это xml а не JSON, всё понятно тогда, этому много примеров, а вот как JSON-структуры загонять - нигде не нахожу.

И еще вопрос к этому же - предложили альтернативный метод, с помощью библиотеки RestSharp.dll, там неплохой .net сервис как раз для JSON обмена. Но вот что получается. Есть некоторый объект RestSharp.RestClient, и у него есть метод Execute. Когда в коде декларирую restClient, и затем набираю restClient., после точки выпадают методы, в т.ч. и Execute, т.е. система его видит. Однако, когда строка кода принимает вид restClient.Execute(restRequest), компилятор ругается и говорит что метода Execute у класса RestSharp.RestClient не существует.
Мне это очень странно, потому что раз так, то как же тогда intellisense видит его в выпадающем списке? т.е. метод прописан, но код не компилируется. Или проблемы уже с самой библиотекой?
А без этого метода никуда, это основа всех взаимодействий RestSharp с веб-сервисом.

Последний раз редактировалось FrolovAndy; 11.07.2016 в 19:10.
Старый 11.07.2016, 20:17   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от FrolovAndy Посмотреть сообщение
когда строка кода принимает вид restClient.Execute(restRequest), компилятор ругается и говорит что метода Execute у класса RestSharp.RestClient не существует.
Эта ошибка означает, что среди сигнатур методов RestClient.Execute() компилятор не нашел подходящей для указанного в коде множества и типа параметров. Как вы объявляете переменную restRequest? Попробуйте явно использовать интрерфейс IRestRequest в качестве типа переменной.
Старый 12.07.2016, 11:11   #9  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Эта ошибка означает, что среди сигнатур методов RestClient.Execute() компилятор не нашел подходящей для указанного в коде множества и типа параметров. Как вы объявляете переменную restRequest? Попробуйте явно использовать интрерфейс IRestRequest в качестве типа переменной.
C IRestRequest тоже пробовал, не помогает. Проблема именно в том, что саму функцию не находит.
Вообще вот как выглядят предлагаемые способы использования, там два варианта.

Может надо и по второму действовать, но тогда вопрос, как это должно быть переложено на X++?
Миниатюры
Нажмите на изображение для увеличения
Название: RestSharp.jpg
Просмотров: 433
Размер:	43.4 Кб
ID:	10881  
Старый 13.07.2016, 11:51   #10  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
В-общем, после долгих мучений, мой личный вердикт: если версия AX 2009 и ниже, то просто так имеющимися средствами реализовать в ней обмен в формате JSON невозможно.
Так что пришлось смириться, установить себе Visual Studio, кодить необходимый функционал на C#, подключать в AX созданные dll, только так, другого пути нет.
Либо перевнедряться на >= AX2012
Старый 13.07.2016, 13:43   #11  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от FrolovAndy Посмотреть сообщение
C IRestRequest тоже пробовал, не помогает. Проблема именно в том, что саму функцию не находит.
Еще раз: ошибка "метода такого-то у класса сякого-то не существует" означает обычно лишь то, что ядро Аксапты не смогло сопоставить типы и перечень параметров, которые вы передаете в коде X++, перегруженным вариантам метода с таким названием в .NET-типе.
Цитата:
Сообщение от FrolovAndy Посмотреть сообщение
В-общем, после долгих мучений, мой личный вердикт: если версия AX 2009 и ниже, то просто так имеющимися средствами реализовать в ней обмен в формате JSON невозможно.
Ну... не совсем так: посмотрите в AX 2012, как работает RetailCommonWebAPI::getMapFromJsonString(), там вроде никакого волшебства нет. Аналогично можно сделать сериализацию данных в JSON, в т.ч. без использования RestSharp, штатными средствами .NET FCL.
За это сообщение автора поблагодарили: FrolovAndy (1).
Старый 13.07.2016, 14:17   #12  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
А какой тип имеет Response? Там вроде бы требуется RestResponse<Некоторый тип>, то есть generics.
Старый 13.07.2016, 15:42   #13  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Еще раз: ошибка "метода такого-то у класса сякого-то не существует" означает обычно лишь то, что ядро Аксапты не смогло сопоставить типы и перечень параметров, которые вы передаете в коде X++, перегруженным вариантам метода с таким названием в .NET-типе.
Ну мы в итоге обошли этот момент, написав в VS обертку, которая сама дёргает execute на RestClient. А уже эта обертка используется из Аксапты. Правда там тоже не без шаманства - приходится сначала объявлять переменную с типом ClrObject, в неё записывать экземпляр из обертки, и уже на ней вызывать нужный метод. Иначе не работает.

Цитата:
Сообщение от gl00mie Посмотреть сообщение
Ну... не совсем так: посмотрите в AX 2012, как работает RetailCommonWebAPI::getMapFromJsonString(), там вроде никакого волшебства нет. Аналогично можно сделать сериализацию данных в JSON, в т.ч. без использования RestSharp, штатными средствами .NET FCL.
Если так, посмотрим и этот вариант. Если честно, в 2012 я и не пытался лазить, потому что не верил что удастся быстро адаптировать код к исполнению на 2009. А так, может и выход...
Старый 13.07.2016, 15:43   #14  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
А какой тип имеет Response? Там вроде бы требуется RestResponse<Некоторый тип>, то есть generics.
В Ax для этого использовали IRestResponse, прокатило.
Старый 24.11.2016, 14:30   #15  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Задача решается одной строкой в Аксапте:
responseText = System.Text.RegularExpressions.Regex::Unescape(responseText);
__________________
С уважением, Александр.
За это сообщение автора поблагодарили: Logger (3), gl00mie (2).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Метод "open" в COM-объекте класса "ADODB.Connection" возвратил код ошибки 0x80004005 (E_FAIL) Poleax DAX: Программирование 14 01.10.2013 14:15
Ошибка в пакетном сервере для "Logon" в COM-объекте класса "MAPI.Session" Bega DAX: Программирование 0 02.08.2012 10:30
"Замещающая" или "дополнительная" транспортная накладная? samolalex DAX: Функционал 7 19.07.2011 23:09
кнопка "Выбрать отборочную накладную" при обработке накладной по закупке (DAX2009) Bega DAX: Функционал 0 27.07.2010 14:35
DAX2009. Модуль "Управление качеством". Проблема в архитектуре. slava09 DAX: Функционал 8 09.07.2008 16:20

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:19.