30.07.2021, 11:37 | #1 |
Участник
|
Использование "/" в параметрах 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()); } 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 |
Участник
|
В некоторых случаях специальные символы требуют дополнительного экранирования. Символ экранирования в Axapta это наклонная черта "\". Вот и попробуй ее добавить в url
Если используются одинарные кавычки, то 2 наклонные черты подряд X++: url = 'http://URI\\/Действие\\/SP3483CN-L%2FTR'; X++: url = @"http://URI\/Действие\/SP3483CN-L%2FTR"; Для примера посмотри метод Global::isValidURL(). Там как раз константа для регулярного выражения и многие символы дополнительно экранируются PS: Если я правильно понял, то экранировать требуется обратный слеш только после ключевого слова "URI", а http можно оставить как есть. Впрочем, тут надо экспериментировать
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 30.07.2021 в 21:21. |
|
03.08.2021, 11:25 | #3 |
Участник
|
К сожалению, ни @ перед текстом в кавычках, ни экранирование не помогли. Также воспользовался 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 |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|