27.06.2016, 18:18 | #1 |
Участник
|
DAX2009, веб-сервисвозращает данные в виде "\u####"
Проблема следующая - с веб-сервисом обмениваюсь данными с помощью .net библиотек, всё идет нормально, до тех пор пока в ходе метода "GET" не получаю запрашиваемые данные. Конкретно, System.IO.StreamReader, метод readToEnd.
Возвращаемая строка приходит то ли в Unicode формате, то ли там в самом начале, в настройке в методах set_* я что-то не так задал, короче в инфологе или отладчике виден просто перечень вида "\u0410\u0431..." и т.д. Есть какое-нибудь средство конвертации такой строки в понимаемый вид? Пробовал играться с System.Text.Encoding::Convert, но ничего путного не вышло, если не считать что в одной из попыток вместо описанного выше текста вылезли кракозябры. Наверно ведь это как-то лечится? Порылся на форуме, вроде много чего-то похожего видел, но приведённые там решения не помогли, а по конкретно описанной проблеме ничего не нашёл. |
|
27.06.2016, 18:59 | #2 |
Дмитрий Ерин
|
X++: System.Web.HttpUtility::HtmlDecode("\u0410\u0431");
__________________
|
|
|
За это сообщение автора поблагодарили: gl00mie (2), alex55 (1), FrolovAndy (1). |
28.06.2016, 10:42 | #3 |
Участник
|
Благодарю Вас, в точности то что надо!
|
|
28.06.2016, 16:38 | #4 |
Участник
|
Решил новую тему не создавать, спросить здесь же, ибо проблемы по тому же веб-сервису, с методом "GET" разобраться удалось, теперь ломаю голову над "POST".
Посмотрел все возможные примеры как отрабатывает - на разных приложениях, на форуме, всюду получается примерно следующая схема - создается request со своим url, после его настройки формируется streamWriter, в который передается еще какая-то информация, чаще всего некий xml, далее на нем вызывается Write(), после чего уже идет response и reader с текстом ответа. Т.е. это так, как должно быть в большинстве случаев. Но в моем варианте, если верить мануалу по API, по той команде которую надо использовать, выходит что всё делается одним url-запросом, и тогда совсем уже непонятно как реализовать такое поведение в AX, что передавать в streamWriter, и нужен ли тогда вообще сам streamWriter. Пробовал без него обойтись - ничего не работает, выдается что ошибочный запрос. Пытался комбинировать - что-то запихивать в url при создании request, остальную часть в streamWriter, но это всё игра в угадайку, и ничего путного не выходит. Короче, запутался окончательно, может есть в жизни какие-то похожие примеры использования "POST" в том виде как я выше описал? Или тут вообще надо подход менять коренным образом, другие механизмы использовать? |
|
29.06.2016, 10:47 | #5 |
Участник
|
При работе с web-сервисом все и всегда все делают одним url-запросом. А все "танцы с бубном" вокруг streamWriter и streamReader- это все или подготовка этого самого url-запроса или разбор полученного ответа
Ну, чтобы было понятно, это как вызов метода с параметром. Можно сказать, что url - это "имя метода", а передаваемый XML - параметр. Точнее, если речь идет о POST, то универсальным параметром является некий "контейнер", а XML- это элемент этого контейнера
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: Pustik (2), FrolovAndy (1). |
29.06.2016, 14:00 | #6 |
Участник
|
Воистину! Огроменная благодарность!
На свежую голову попробовал по Вашему совету всё запихнуть в url, и без streamWriter, и всё получилось. Почему вчера не получалось - так и не понял, наверно под вечер мозги закипели, и где-то подкосячил. |
|
11.07.2016, 19:00 | #7 |
Участник
|
Теперь продолжение "приключений".
Всё вышесказанное хорошо работало до тех пор, пока не потребовалось работать с командами типа 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 |
Участник
|
Эта ошибка означает, что среди сигнатур методов RestClient.Execute() компилятор не нашел подходящей для указанного в коде множества и типа параметров. Как вы объявляете переменную restRequest? Попробуйте явно использовать интрерфейс IRestRequest в качестве типа переменной.
|
|
12.07.2016, 11:11 | #9 |
Участник
|
Цитата:
Вообще вот как выглядят предлагаемые способы использования, там два варианта. Может надо и по второму действовать, но тогда вопрос, как это должно быть переложено на X++? |
|
13.07.2016, 11:51 | #10 |
Участник
|
В-общем, после долгих мучений, мой личный вердикт: если версия AX 2009 и ниже, то просто так имеющимися средствами реализовать в ней обмен в формате JSON невозможно.
Так что пришлось смириться, установить себе Visual Studio, кодить необходимый функционал на C#, подключать в AX созданные dll, только так, другого пути нет. Либо перевнедряться на >= AX2012 |
|
13.07.2016, 13:43 | #11 |
Участник
|
Цитата:
Ну... не совсем так: посмотрите в AX 2012, как работает RetailCommonWebAPI::getMapFromJsonString(), там вроде никакого волшебства нет. Аналогично можно сделать сериализацию данных в JSON, в т.ч. без использования RestSharp, штатными средствами .NET FCL. |
|
|
За это сообщение автора поблагодарили: FrolovAndy (1). |
13.07.2016, 14:17 | #12 |
Участник
|
А какой тип имеет Response? Там вроде бы требуется RestResponse<Некоторый тип>, то есть generics.
|
|
13.07.2016, 15:42 | #13 |
Участник
|
Цитата:
Если так, посмотрим и этот вариант. Если честно, в 2012 я и не пытался лазить, потому что не верил что удастся быстро адаптировать код к исполнению на 2009. А так, может и выход... |
|
13.07.2016, 15:43 | #14 |
Участник
|
|
|
24.11.2016, 14:30 | #15 |
Участник
|
Задача решается одной строкой в Аксапте:
responseText = System.Text.RegularExpressions.Regex::Unescape(responseText);
__________________
С уважением, Александр. |
|
|
За это сообщение автора поблагодарили: Logger (3), gl00mie (2). |
|
|