Рассмотрим пример варианта реализации обмена сообщениями xml по средствам протокола HTTP в Dynamics AX 2012.
Реализуем класс обмена сообщениями.
class HttpConnection
{
str httpStatusDescr, // Описание кода состояния
responseData, // Информационная часть ответа
resPath, // Путь к ресурсу
networkAddress, // Адрес
reqMethod; // HTTP метод
int httpStatusCode, // Код состояния, который содержится в ответе
networkPort; // Порт
Xml xml; // Сообщение
boolean isErrorDetected;
}
public static HttpConnection newConnection()
{
HttpConnection connection;
;
connection = new HttpConnection();
return connection;
}
Метод обрабатывающий возможные ошибки:
// Анализировать ошибку по исключению или по коду состояния
final protected boolean errorDetect(boolean _isException)
{
#define.httpStatusOk(200)
int lastError;
str lastErrorText;
;
if (_isException)
{
warning("Ошибка соединения");
isErrorDetected = true;
}
else if (httpStatusCode != #httpStatusOk)
{
warning("Ошибка запроса");
isErrorDetected = true;
setPrefix("Информация об ошибке");
info(strfmt("Код: %1", httpStatusCode));
info(strfmt("Описание: %1", httpStatusDescr));
}
return httpStatusCode != #httpStatusOk;
}
Возвращает информацию о фиксации ошибок:
final public boolean isErrorDetected()
{
;
return isErrorDetected;
}
Вызов отправки сообщения:
public Xml sendRequest()
{
Xml responseXml;
;
try
{
this.makeRequest();
}
catch
{
this.errorDetect(true);
}
if (!this.isErrorDetected())
{
if (!this.errorDetect(false))
{
responseXml = responseData;
}
}
return responseXml;
}
Сам процесс обмена:
protected void makeRequest()
{
System.Net.HttpWebRequest request = null;
System.Net.HttpWebResponse response = null;
CLRObject webResponse;
System.IO.Stream stream;
System.IO.StreamReader streamReader;
System.Exception ex;
System.Net.WebException webException;
System.Text.UTF8Encoding encoding;
System.Byte[] byteArray;
str url;
str contentType;
str content;
str boundary;
Xml requestXml;
#define.NewLine('\r\n')
#define.INTERNET_DEFAULT_HTTP_PORT (80)
if (networkAddress)
{
url = 'http://' +
networkAddress +
':' +
strFmt('%1', networkPort ? networkPort : #INTERNET_DEFAULT_HTTP_PORT) +
'/' +
resPath;
}
else
{
isErrorDetected = checkFailed('Не указан сетевой адрес интеграционного интерфейса. Соединение невозможно');
}
if (!isErrorDetected)
{
boundary = strlwr(strrem(guid2str(newguid()), '{-}'));
contentType = strfmt('multipart/form-data; boundary="%1"', boundary);
requestXml = XmlDocument::newXml(xml).toString();
content = '--' + boundary + #NewLine +
'Content-Disposition: form-data; name="file"; filename="HttpTest.xml"' + #NewLine +
'Content-Type: application/xml' + #NewLine +
#NewLine +
requestXml + #NewLine +
'--' + boundary + '--' + #NewLine;
try
{
request = System.Net.WebRequest::Create(url) as System.Net.HttpWebRequest;
request.set_Method(reqMethod);
if (contentType)
{
request.set_ContentType(contentType);
}
if (content)
{
encoding = new System.Text.UTF8Encoding();
byteArray = encoding.GetBytes(content);
request.set_ContentLength(byteArray.get_Length());
stream = request.GetRequestStream();
stream.Write(byteArray, 0, byteArray.get_Length());
stream.Close();
}
webResponse = request.GetResponse();
response = webResponse as System.Net.HttpWebResponse;
}
catch (Exception::CLRError)
{
ex = ClrInterop::getLastException();
if (ex != null)
{
ex = ex.get_InnerException();
if ((ex != null) && (ex is System.Net.WebException))
{
webException = ex as System.Net.WebException;
webResponse = webException.get_Response();
response = webResponse as System.Net.HttpWebResponse;
}
}
}
stream = response.GetResponseStream();
streamReader = new System.IO.StreamReader(stream);
responseData = streamReader.ReadToEnd();
streamReader.Close();
stream.Close();
response.Close();
httpStatusCode = response.get_StatusCode();
httpStatusDescr = response.get_StatusDescription();
}
}
Все комментарии
Чтобы оставить комментарий, необходимо войти или зарегистрироваться.
Пока нет комментариев. Будьте первым!