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!

Добавить комментарий

Sidebar