Wednesday, August 10, 2016

Calling an external RESTful Web Service from X++

With the following Job you can consume an External RESTful Web Service:
static void ConsumingRestService(Args _args)
{
    str destinationUrl = 'http://<server>/<service>', requestXml, responseXml;
    System.Net.HttpWebRequest       request;
    System.Net.HttpWebResponse      response;
    CLRObject                       clrObj;
    System.Byte[]                   bytes;
    System.Text.Encoding            utf8;
    System.IO.Stream                requestStream, responseStream;
    System.IO.StreamReader          streamReader;
    System.Exception                ex;

    requestXml = ""
        +"<XML>"
        +"</XML>";

    try
    {
        clrObj = System.Net.WebRequest::Create(destinationUrl);
        request = clrObj;

        utf8 = System.Text.Encoding::get_UTF8();
        bytes = utf8.GetBytes(requestXml);

        request.set_ContentType("text/xml; encoding='utf-8'");
        request.set_ContentLength(bytes.get_Length());
        request.set_Method("POST");

        requestStream = request.GetRequestStream();
        requestStream.Write(bytes, 0, bytes.get_Length());

        response = request.GetResponse();

        responseStream = response.GetResponseStream();
        streamReader = new System.IO.StreamReader(responseStream);
        responseXml = streamReader.ReadToEnd();

        info(responseXml);
    }
    catch (Exception::CLRError)
    {
        //bp deviation documented
        ex = CLRInterop::getLastException().GetBaseException();
        error(ex.get_Message());
    }


    requestStream.Close();
    streamReader.Close();
    responseStream.Close();
    response.Close();

}