Forum Discussion

hoaphan's avatar
hoaphan
New Contributor III
4 years ago

REST API USE

Hello OneStream Community,

I'm working on how to implement a REST API in OS, but i'm not sure to understand all the steps, i've already read the documentation and i've found it very hard to understand, can anyone please explain how can we implement it in OS what are the steps to follow, i started by downloading and installing POSTMAN for the tests but i don't know what should do i do after, please any help will be much appreciated.

I'm also woundering if there any data management that should be used for this

Thanks and merry christmas.

  • Ahhh, thank you CoPilot. I got it to work with this code:

    		Private Function GetSourceDataREST(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Transformer) As DataTable
    			Try
    				Dim strEntityWF As String = api.WorkflowProfile.Name.Split(".")(0)	
    				
    '				Use already encoded credentials (eg.,In Postman) key
    				Dim wdCreds As String = "<CREDENTIALS>"
    				'Call the REST API		
    				Dim wc As New WebClient
    				wc.Encoding = Encoding.UTF8
    				wc.Headers("cache-control") = "no-cache"
    				wc.Headers("ContentType") = "application/json"
    				wc.Headers("Accept") = "application/json"
    				wc.Headers("Authorization") = "Basic " & wdCreds
    						
    				Dim jsonURL As String = "<AURL>"
    				Dim json As String = wc.DownloadString(jsonurl)
    						
    				Dim pullData As DataTable = ParseJsonToDataTable(json, strEntityWF)
    
    				'Close Web connection
    				wc.dispose
    				'Return the dataset
    				Return pullData
    			Catch ex As Exception
    			Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
    			End Try				
    				
    			End Function		
    			
    			
     			Function ParseJsonToDataTable(json As String, EntityName As String) As DataTable
    		        Dim dataTable As New DataTable()
    		        dataTable.Columns.Add("entity", GetType(String))
    		        dataTable.Columns.Add("displayName", GetType(String))
    		        dataTable.Columns.Add("amount", GetType(Integer))
    
    		        Dim jObject As JObject = JObject.Parse(json)
    		        Dim dataArray As JArray = jObject("employees")
    
    		        For Each item As JObject In dataArray
    		            Dim row As DataRow = dataTable.NewRow()
    		            row("entity") = EntityName
    		            row("displayName") = item("displayName")
    		            row("amount") = 1
    		            dataTable.Rows.Add(row)
    		        Next
    
            		Return dataTable
        		End Function		

     

  • Here is a connector BR we used to import from workday. You can use this as a starting point/reference and build your BR and use this connector BR in a DataSource. Original code provided by OneStream (courtesy Joakim Kulan)

    Imports System
    Imports System.Data
    Imports System.Data.Common
    Imports System.IO
    Imports System.Collections.Generic
    Imports System.Globalization
    Imports System.Linq
    Imports Microsoft.VisualBasic
    Imports System.Windows.Forms
    Imports OneStream.Shared.Common
    Imports OneStream.Shared.Wcf
    Imports OneStream.Shared.Engine
    Imports OneStream.Shared.Database
    Imports OneStream.Stage.Engine
    Imports OneStream.Stage.Database
    Imports OneStream.Finance.Engine
    Imports OneStream.Finance.Database
    Imports System.Net
    Imports System.Web.Script.Serialization
    Imports newtonsoft.json
    Imports newtonsoft.json.linq
    Imports System.Xml
    
    Namespace OneStream.BusinessRule.Connector.FTE_Workday
    	Public Class MainClass
    		Public Function Main(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Transformer, ByVal args As ConnectorArgs) As Object
    			Try
    				'Get the Field name list or load the data 
    				Select Case args.ActionType
    					Case Is = ConnectorActionTypes.GetFieldList
    						'Return Field Name List if using Field List Method to get field list in GetFieldList
    						'-----------------------------------------------------------
    						Dim fieldList As List(Of String) = GetFieldList(si, globals, api)
    						Return fieldList
    					Case Is = ConnectorActionTypes.GetData
    						Dim sourceDataREST As DataTable = GetSourceDataREST(si, globals, api)
    						api.Parser.ProcessDataTable(si, sourceDataREST, False, api.ProcessInfo)
    						Return Nothing
    				End Select
    				Return Nothing
    			Catch ex As Exception
    				Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
    			End Try
    		End Function
    		
    		'Create the field list items to get field list (Recommended)
    		'-----------------------------------------------------------
    		Private Function GetFieldList(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Transformer) As List(Of String)
    			Try
    				Dim fields As New List(Of String)
    								      
    				fields.add("Field1")
    				fields.add("Field2")
    				..
    				fields.add("FieldN")
    
    				Return fields
    			Catch ex As Exception
    				Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
    			End Try
    		End Function
    
    		'Create the data load Statement
    		Private Function GetSourceDataREST(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Transformer) As DataTable
    			Try
    '				Dim wdUser As String = ""
    '				Dim wdPass As String = ""
    '				Dim wdCreds As String = encodebase64(wdUser & ":" & wdPass)
    '				Use already encoded credentials (eg.,In Postman) key
    				Dim wdCreds As String = "<encodedkey>"
    				'Call the REST API		
    				Dim wc As New WebClient
    				wc.Encoding = Encoding.UTF8
    				wc.Headers("cache-control") = "no-cache"
    				wc.Headers("ContentType") = "application/json"
    				wc.Headers("Accept") = "application/json"
    				wc.Headers("Authorization") = "Basic " & wdCreds
    												
    				Dim jsonURL As String = "<webapiurl>?Format=json&<paramname>=" & <paramvalue>
    				Dim json As String = wc.DownloadString(jsonurl)
    
    				'Convert result in API to table format
    '				Dim pulldata As DataTable = jsonConvert.DeserializeObject(Of DataTable)(json)
    				Dim dataSet As DataSet = jsonConvert.DeserializeObject(Of DataSet)(json)
    				Dim pullData As DataTable = dataSet.Tables(0)
    				
    				'Close Web connection
    				wc.dispose
    				'Return the dataset
    				Return pullData
    			Catch ex As Exception
    			Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
    			End Try
    		End Function
    	End Class
    End Namespace

     

    • hoaphan's avatar
      hoaphan
      New Contributor III

      Ok thanks for the BR, for now what im trying to test is to connect Onestrem to POSTMAN via the URL of my application and i have already a data management sequence created  and i want to execute this sequence from POSTMAN, but i can't  the URL is invalid in Postman i don't know why
      Thanks for your help 🙂

      • Sai_Maganti's avatar
        Sai_Maganti
        Contributor II

        I think the key to this is setting up the one of the Authentication providers OneStream supports. The design and reference guide explains how you set this up. I hope you've already done this.

        If you can provide more information like what error message you're getting 400, 404 etc from postman, someone might be able to help you.

    • WernerN's avatar
      WernerN
      Contributor

      Life saving contribution.  Thank you so much for sharing your code.

    • Sridhar_M's avatar
      Sridhar_M
      Contributor

      Thank you Sai for sharing the snippet. This is really helpful. 

      I've a question, your using this connector to load directly to a register table ? If yes May I know how your calling this business rule ?

      • Sai_Maganti's avatar
        Sai_Maganti
        Contributor II

        Sridhar

        I used this in a connector BR to import FTE actuals from workday.

        Best

        Sai 

  • Are you trying to import data into OneStream using an api call? or export data out of OneStream?

    • hoaphan's avatar
      hoaphan
      New Contributor III

      Hello Sai_Maganti,

      i'm trying to import data into OS using an API call,

      Thanks for your help