Integrate SharePoint Online with Dynamics AX Legacy Application
5. February 2018 Leave a comment
SharePoint Online is a wide spread solution for collaboration. Actual versions of Dynamics AX / 365 provide great integration capabilities and for all other purpose there exists the SharePoint Online Client API. However, legacy applications may not support the required libraries or .NET framework versions to use the SharePoint Online Client API. One way to overcome this issue is to utilize the REST API and communicate via HTTP. Here you can find a step by step guide how to provide an external application access to SharePoint Online via an App: http://www.ktskumar.com/2017/01/access-sharepoint-online-using-postman/
Register an App in SharePoint Online
The first thing you need to do is register an App in SharePoint Online. Open the registration site in a browser: https://YOUR_SITE.sharePoint.com/_layouts/15/appregnew.aspx . In my case I’m using a sub site, therefore my URL would look like this: https://YOUR_SITE.sharepoint.com/sites/development/_layouts/15/appregnew.aspx .Use the form to generate a client ID and a secret code. Provide any title you like. Set the domain to localhost and redirection URL to https://localhost
Set Permissions for the App
Open the following URL in a Browser: https://YOUR_SITE.sharepoint.com/_layouts/15/AppInv.aspx . Use the Client ID to lookup the created App. In the free text form add the required permissions e.g. access a list. You can find the syntax here: https://www.sumitagrawal.io/sharepoint-add-in-permission-xml-cheatsheet/ If you need access to more than one list, you have to repeat this step. In my case I only need access to one list. The XML Permission Code looks like this:
<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest
Scope="http://sharepoint/content/sitecollection/web/list"
Right="Read" />
</AppPermissionRequests>
Click the Create button, this will forward you to a form where you can choose which list can be accessed by the app.
SharePoint Online Tenant ID
To find the Tenant ID open the following URL in your Browser https://YOUR_SITE.sharepoint.com/_layouts/15/appprincipals.aspx Since I’m using a sub site my URL looks like this https://YOUR_SITE.sharepoint.com/sites/development/_layouts/15/appprincipals.aspx . There you can find the Tenant ID
Create a Token
To interact with SharePoint Online you need to generate a token.This is done by sending an HTTP POST requiest with client ID, secret, and desired resource to SharePoint Online. Here is the Code in X++ written in Ax 2009.
str clientID = “<YOUR_CLIENT_APP_ID>”;
str secret = “<YOUR_SECRET>”;
str tenant = “<YOUR_TENANT>”;
str ctx = “00000003-0000-0ff1-ce00-000000000000”; //i.e. SharePoint
str sp = “<YOUR_SITE>.sharepoint.com”;
str listName = “<NAME_OF_YOUR_LIST>”; // e.g. Customers
str listUrl = “https://YOUR_SITE.sharepoint.com/_api/web/lists/GetByTitle(‘”+listName+”‘)/items; “
str url = “https://accounts.accesscontrol.windows.net/”
+tenant+”/tokens/OAuth/2″;
System.Net.WebClient cl = new System.Net.WebClient();
System.Net.WebHeaderCollection headers = new System.Net.WebHeaderCollection();
System.Collections.Specialized.NameValueCollection body = new System.Collections.Specialized.NameValueCollection();
System.Byte[] response;
System.Text.Encoding enc = System.Text.Encoding::get_UTF8();
System.String responseText;
str xppResponse;
int indexOf;
int start;
int totalLength;
int length;
str token;
;
headers.Add(“Content-Type”,”application/x-www-form-urlencoded”);
body.Add(“grant_type”,”client_credentials”);
body.Add(“client_id”,clientID+”@”+tenant);
body.Add(“client_secret”,secret);
body.Add(“resource”,ctx+”/”+sp+”@”+tenant);
cl.set_Headers(headers);
response = cl.UploadValues(url,”POST”,body);
responseText = enc.GetString(response);
// cut token out of response text
indexOf = responseText.IndexOf(“access_token”);
start = indexOf + 15;
totalLength = responseText.get_Length();
length = totalLength – start – 2;
xppResponse = responseText;
token = responseText.Substring(start,length);
Query List Elements
The token has a valid timestamp measured in Unix Ticks. So it might be good idea to store the token in a parameter table and only request a new one if it is or will expire soon. However, in this example I go on and query the Customer List.
// .. Code from above
cl = new System.Net.WebClient();
headers = new System.Net.WebHeaderCollection();
headers.Add(“Accept”,”application/atom+xml”);
headers.Add(“Authorization”,”Bearer “+token);
cl.set_Headers(headers);
body.Clear();
url = listUrl;
responseText = cl.DownloadString(listUrl);
xppResponse = responseText;
info(xppResponse);
In this case the response type is an XML. You may parse the XML and only view e.g. the Title Tag or any other fields your are interested in. Here is the Infolog of the complete XML response from the SharePoint Online List.