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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.07.2021, 11:37   #1  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
Использование "/" в параметрах API
Коллеги, добрый день!

Есть задача передать в некоторый API параметр, содержащий "/".

Формат обращения к API:
uri/действие/параметр
Таким образом, если передать параметр с "/", то api не маршрутизируется на соответствующее действие с параметром.
Если заменить "/" на кодировку этого символа, то есть "%2F", то через адресную строку браузера всё хорошо отрабатывает. Однако, с реализацией запроса через DAX возникают проблемы:
- использование .Net библиотек (System.Net.HttpWebRequest) не даёт результата (ресурс не найден, ошибка 404);
- использование COM (XMLHttpRequest) отрабатывает корректно.

Что может быть не так с System.Net.HttpWebRequest?

Пример кода с System.Net.HttpWebRequest:
X++:
    System.Net.HttpWebRequest               httpRequest  = null;
    System.Net.WebHeaderCollection          headers;
    System.Net.HttpWebResponse              httpResponse = null;
    CLRObject                               clro         = null;
    System.IO.Stream                        stream       = null;
    System.IO.StreamReader                  streamReader = null;
    str                                     url;
    str                                     result;
    ;
    url                         = 'http://URI/Действие/SP3483CN-L%2FTR';
    try
    {
        new InteropPermission(InteropKind::ClrInterop).assert();

        clro                    = System.Net.WebRequest::Create(url);
        httpRequest             = clro;
        httpRequest.set_UserAgent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)");
        httpRequest.set_ContentType("application/x-www-form-urlencoded");
        httpRequest.set_Method("GET");

        httpResponse            = httpRequest.GetResponse();
        stream                  = httpResponse.GetResponseStream();
        streamReader            = new System.IO.StreamReader(stream);
        result                  = streamReader.ReadToEnd();
        info(result);

        CodeAccessPermission::revertAssert();
    }
    catch(Exception::CLRError)
    {
        throw error(AifUtil::getClrErrorMessage());
    }
Пример кода с использованием XMLHttpRequest:
X++:
    new InteropPermission(InteropKind::ComInterop).assert();

    request = new XMLHttpRequest();
    url = 'http://URI/Действие/SP3483CN-L%2FTR';
    request.open('GET'
               , connectURL
                 );
    request.setRequestHeader("Content-Type", "application/json");
    request.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)");

    request.send('');

    tinfo(request.responseText());

    CodeAccessPermission::revertAssert();
__________________
MS Dynamics AX 2009

Kernel 5.0.1600.4110
Application 5.0.1500.6491
Старый 30.07.2021, 20:40   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
В некоторых случаях специальные символы требуют дополнительного экранирования. Символ экранирования в Axapta это наклонная черта "\". Вот и попробуй ее добавить в url

Если используются одинарные кавычки, то 2 наклонные черты подряд

X++:
url = 'http://URI\\/Действие\\/SP3483CN-L%2FTR';
Если использовать символ @, то достаточно одной наклонной черты. При этом текст в двойных кавычках, а не в одинарных

X++:
url = @"http://URI\/Действие\/SP3483CN-L%2FTR";
Это обычно делается, если url вводится как текстовая константа в коде. Если же url получен из вне кода (введен в формах в объектах ввода), то этого дополнительного экранирования обычно не требуется

Для примера посмотри метод Global::isValidURL(). Там как раз константа для регулярного выражения и многие символы дополнительно экранируются

PS: Если я правильно понял, то экранировать требуется обратный слеш только после ключевого слова "URI", а http можно оставить как есть. Впрочем, тут надо экспериментировать
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 30.07.2021 в 21:21.
Старый 03.08.2021, 11:25   #3  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
К сожалению, ни @ перед текстом в кавычках, ни экранирование не помогли. Также воспользовался Global::isValidURL(url) - он вернул false.

Ещё раз хочу обратить внимание, что реализация через класс XMLHttpRequest успешна. То сеть, COM-объектная модель срабатывает.
Не срабатывает использование System.Net.HttpWebRequest. Видимо, там в тексте url заменяется закодированный слэш на явный, что портит всю картину.
__________________
MS Dynamics AX 2009

Kernel 5.0.1600.4110
Application 5.0.1500.6491
Теги
api, httpwebrequest, xmlhttprequest

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
sertandev: Empowering D365 FO service endpoints with Azure API Management service Blog bot DAX Blogs 0 15.05.2019 22:11
Использование "like" при работе с классом "QueryBuildRange" poul DAX: Программирование 18 11.08.2006 12:20
Недостаточно прав на использование таблицы "Common" (UNKNOWN) Ace of Database DAX: Программирование 6 26.11.2004 12:59
Серия документов "Номер лота" не задана в параметрах модуля Управления запасами ATimTim DAX: Функционал 8 01.07.2004 12:16
Использование складской аналитики "Ячейка" Елена Сысовская DAX: Функционал 3 25.03.2003 20:27
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:31.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.