HTTP: обмен сообщениями в Dynamics AX 2012
Рассмотрим пример варианта реализации обмена сообщениями 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(); } }
Comments
So empty here ... leave a comment!