onsdag den 11. januar 2012

Connecting to REST WebService from Navision

I will let the code speak for itself:

Complete CodeUnit:

 OBJECT Codeunit 90002 WebService Connection  
 {  
  OBJECT-PROPERTIES  
  {  
   Date=11-01-12;  
   Time=15:05:21;  
   Modified=Yes;  
   Version List=;  
  }  
  PROPERTIES  
  {  
   OnRun=BEGIN  
       CREATE(XmlIn);  
       CREATE(XmlOut);  
       // Populating XmlIn document for test purposes  
       LoadTestXml();  
       // Invoke method  
       Send();  
       // Save result to disc  
       XmlOut.save('C:\Temp\XML\response.xml');  
      END;  
  }  
  CODE  
  {  
   VAR  
    XmlIn@1000000004 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft XML, v6.0'.DOMDocument";  
    XmlOut@1000000003 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft XML, v6.0'.DOMDocument";  
    locautXmlHttp@1160870000 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{88D96A0A-F192-11D4-A65F-0040963251E5}:'Microsoft XML, v6.0'.XMLHTTP60";  
   PROCEDURE Send@1000000004();  
   BEGIN  
    // Communication  
    CREATE(locautXmlHttp);  
    locautXmlHttp.open('POST','http://localhost:56063/RESTservice.ashx',0);  
    locautXmlHttp.setRequestHeader('Content-type','text/xml; charset=utf-8');  
    locautXmlHttp.setRequestHeader('KeepAlive','false');  
    locautXmlHttp.setRequestHeader('Timeout','5000');  
    // Send request  
    locautXmlHttp.send(XmlIn);  
    // Get response  
    XmlOut := locautXmlHttp.responseXML;  
    XmlOut.async := TRUE;  
    // Show result  
    MESSAGE(XmlOut.xml);  
   END;  
   PROCEDURE LoadTestXml@1160870000();  
   BEGIN  
    XmlIn.loadXML(  
    '<xmltest>' +  
    '<test>' +  
    'This document can contain anything. But must not contain xml decleration.' +  
    '</test>' +  
    '</xmltest>');  
   END;  
   BEGIN  
   {  
    Shows how to connect to a REST Web Service  
   }  
   END.  
  }  
 }  


.NET REST webservice implemented as a generic handler (.ashx) nothing fancy:

 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Web;  
 using System.Text;  
 namespace WebServiceApplication  
 {  
   /// <summary>  
   /// Summary description for RESTservice  
   /// </summary>  
   public class RESTservice : IHttpHandler  
   {  
     public void ProcessRequest(HttpContext context)  
     {  
       string requestMethod = context.Request.HttpMethod; // POST, PUT, GET or DELETE  
       System.Xml.XmlDocument doc = new System.Xml.XmlDocument();  
       doc.Load(context.Request.InputStream);  
       System.IO.Stream stream = context.Request.InputStream;  
       byte[] bytes = new byte[stream.Length];  
       stream.Position = 0; // Resetting reading position  
       stream.Read(bytes, 0, (int)stream.Length);  
       string data = Encoding.ASCII.GetString(bytes); // this is your string  
       //context.Response.ContentType = "text/plain";  
       context.Response.ContentType = "text/xml";  
       context.Response.Write("<result>Hello World</result>");  
       context.Response.End();  
     }  
     public bool IsReusable  
     {  
       get  
       {  
         return false;  
       }  
     }  
   }  
 }  

4 kommentarer:

  1. Hi, I am getting an error while using your codeunit
    "Error 405: Method not allowed"

    What could be its resolution?

    SvarSlet
  2. Hi Dhan Raj
    It's an error message from the service you're trying to call informing you that you are not allowed to post data to the service (I'm assuming you are using the code as posted above).
    A little info on the error here: http://www.checkupdown.com/status/E405.html

    Hope it helps.

    /Simon

    SvarSlet
  3. Hi,
    How we can call JSON rest API with JSON request and response from NAV 2009.

    Please advice

    SvarSlet
    Svar
    1. Hey Ahmad,

      Have you actually done this in the end? Called a Rest API from NAV 2009?

      Cheers

      Slet