Коллеги, добрый день!
Есть задача передать в некоторый 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();