Показать сообщение отдельно
Старый 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