Forum Discussion

hoaphan's avatar
hoaphan
New Contributor III
3 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.

  • 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

     

    • IBK's avatar
      IBK
      New Contributor III

      Hello Sai,

          Thank You for sharing this. I have another question on the json payload itself. Would you have an example of the json which has nested namespaces as below:  Any help would be greatly appreciated:

       

      {

       
      "A1": null,
      "B1": 999999,
      "C1": [
      888888
      ],
      "FY": 2023,
      "D1": "ZZ",
      "E1": "test",
      "F1": 1,
      "costSummary": [
      {
      "A1": 100000.0,
          "B1":999999   
      },
      {
      "C1": 100000.0,
          "D1":999999   
      }
      ]
      }

       

       

      This is how we have in Postman right now: But have to make it nested as shown in the example above.

      ."BaseWebServerUrl": "https://XXX.com/OneStreamWeb",
      "ApplicationName": "OneStream NBC",
      "DataManagementGroupName": "ABC",
      "StepName": "XYZ",
      "CustomSubstVarsAsCommaSeparatedPairs":"A1=-66666666|7777777,
      B1=888888,C1=70638,D1=99999,D1=,fy=2024,E1=AG,F1=0.00,D1=5"

    • 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 

    • WernerN's avatar
      WernerN
      Contributor

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

  • 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